Neo4j - 家族图设计和 ancestor/pedigree 查找

Neo4j - family graph design and ancestor/pedigree lookup

我刚开始玩 Neo4j,如果这是一个简单的概念,我深表歉意...

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

我正在尝试将所有节点及其属性存储在 Neo4j 中,并通过 HAS_FATHERHAS_MOTHER 关系连接它们。这是一个好方法吗?使用 HAS_PARENT 并将每个关系上的 parent_type 属性 设置为 fathermother 是否更有益?我是否还应该在所有 parents 上保存一个名为 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)

如有任何帮助或提示,我们将不胜感激。谢谢!

使用 HAS_MOTHERHAS_FATHER 而不是类型 属性 的 HAS_PARENT 肯定更好。在更详细的关系的情况下,例如当您查询母亲时,您的遍历不需要挖掘属性——它们可以完全依赖于关系。

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

如果你有语义相反的关系,你不必明确地为它们建模,因为如果 a 是 b 的母亲,则 b 是 a 的儿子。因此,对于查询子项,只需按照相反方向的 HAS_FATHERHAS_MOTHER 即可。