Neo4j - 家庭图设计和祖先/谱系查找

时间:2015-03-12 18:51:43

标签: graph neo4j cypher neo4jphp

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

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

我正在努力将我的所有节点及其属性存储在Neo4j中,并通过HAS_FATHERHAS_MOTHER关系将它们连接起来。这是一个好方法吗?使用HAS_PARENT并在每个关系上为parent_typefather设置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 个答案:

答案 0 :(得分:2)

使用HAS_MOTHERHAS_FATHER代替带有type属性的HAS_PARENT肯定更好。如果有更详细的关系,例如当你查询母亲时,你的遍历不需要深入挖掘属性 - 他们可以完全依赖关系。

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

如果你有语义上的反向关系,你不必明确地对它们进行建模,因为如果a是b的母亲,那么b是a的儿子。因此,对于查询孩子,只需反方向跟HAS_FATHERHAS_MOTHER