Neo4j - 家族图设计和祖先/家谱查询

3

我刚开始尝试使用Neo4j,如果这是一个简单的概念,请谅解...

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

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

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

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

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

1个回答

2
使用HAS_MOTHERHAS_FATHER代替具有类型属性的HAS_PARENT肯定更好。在关系更加详细的情况下,例如当您查询母亲时,您的遍历不需要深入属性-它们可以仅依赖于关系。
这样做更有效的原因是属性是按需惰性加载的,请参见http://neo4j.com/docs/stable/performance-guide.html#_neo4j_primitives_lifecycle
如果您具有语义上的反向关系,则不必显式地对其进行建模,因为如果a是b的母亲,则b是a的儿子。因此,要查询子项,只需沿着相反方向跟随HAS_FATHERHAS_MOTHER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接