3

我刚开始玩 Neo4j,所以如果这是一个简单的概念,我很抱歉......

我正在构建一个相对较大的家庭信息数据库(几百万个节点,每个节点大约有 5-15 个属性)。截至目前,所有数据都存储在使用 Redis 作为缓存层的 mysql 数据库中,但我正在尝试将 Redis 换成 Neo4j 以帮助加快一些更昂贵的查询(并最终使用 Neo4j 作为主数据存储而不是 mysql)。

我正在尝试将所有节点及其属性存储在 Neo4j 中,并通过HAS_FATHERHAS_MOTHER关系连接它们。这是一个好方法吗?在每个关系上使用或HAS_PARENT设置属性会更有益吗?我是否还应该保存所有父母的反向关系?我的选择有哪些优点和缺点?parent_typefathermotherHAS_CHILD

其次,假设我正在使用HAS_FATHERandHAS_MOTHER关系,那么获取 7 代后所有直系祖先(谱系)的所有节点、属性和关系的最佳查询是什么?这是我目前正在使用的示例查询,但我是 Cypher 的新手,对瓶颈、优化等不太熟悉。

MATCH tree = (c)-[:HAS_FATHER|HAS_MOTHER*0..7]->(p)
WHERE c.id = 29421
RETURN nodes(tree), rels(tree)

任何帮助或提示将不胜感激。谢谢!

4

1 回答 1

2

拥有HAS_MOTHERandHAS_FATHER而不是HAS_PARENT带有 type 属性的 a 肯定更好。在更详细的关系的情况下,例如当您查询母亲时,您的遍历不需要深入研究属性 - 它们可以完全依赖关系。

性能更高的原因是属性是按需延迟加载的,请参阅http://neo4j.com/docs/stable/performance-guide.html#_neo4j_primitives_lifecycle

如果您有语义上的反向关系,则不必显式建模它们,因为如果 a 是 b 的母亲,则 b 是 a 的儿子。因此,对于查询孩子,只需按照HAS_FATHER相反HAS_MOTHER的方向。

于 2015-03-13T09:05:46.237 回答