我刚刚开始玩Neo4j,所以如果这是一个简单的概念,我很抱歉...
我正在建立一个相对较大的家庭信息数据库(几百万个节点,每个节点有大约5-15个属性)。截至目前,所有数据都使用Redis作为缓存层存储在mysql数据库中,但我正在努力为Redo for Neo4j切换,以帮助加快一些更昂贵的查询(并最终使用Neo4j)作为主数据存储而不是mysql)。
我正在努力将我的所有节点及其属性存储在Neo4j中,并通过HAS_FATHER
和HAS_MOTHER
关系将它们连接起来。这是一个好方法吗?使用HAS_PARENT
并在每个关系上为parent_type
或father
设置mother
属性会更有益吗?我是否还应该为所有父母保存一个名为HAS_CHILD
的反向关系?我的选择有哪些优点和缺点?
其次,假设我使用的是HAS_FATHER
和HAS_MOTHER
关系,那么获取所有直接祖先的所有节点,属性和关系的最佳查询是什么(谱系) )7代之遥?这是我目前正在玩的一个示例查询,但我是Cypher的新手,我对瓶颈,优化等不太熟悉。
MATCH tree = (c)-[:HAS_FATHER|HAS_MOTHER*0..7]->(p)
WHERE c.id = 29421
RETURN nodes(tree), rels(tree)
任何帮助或提示将不胜感激。谢谢!
答案 0 :(得分:2)
使用HAS_MOTHER
和HAS_FATHER
代替带有type属性的HAS_PARENT
肯定更好。如果有更详细的关系,例如当你查询母亲时,你的遍历不需要深入挖掘属性 - 他们可以完全依赖关系。
更高效的原因是属性是按需加载的,请参阅http://neo4j.com/docs/stable/performance-guide.html#_neo4j_primitives_lifecycle。
如果你有语义上的反向关系,你不必明确地对它们进行建模,因为如果a是b的母亲,那么b是a的儿子。因此,对于查询孩子,只需反方向跟HAS_FATHER
和HAS_MOTHER
。