Neo4j - 家族图设计和 ancestor/pedigree 查找
Neo4j - family graph design and ancestor/pedigree lookup
我刚开始玩 Neo4j,如果这是一个简单的概念,我深表歉意...
我正在构建一个相对较大的家庭信息数据库(几百万个节点,每个节点大约有 5-15 个属性)。截至目前,所有数据都存储在使用 Redis 作为缓存层的 mysql 数据库中,但我正在尝试将 Redis 切换为 Neo4j 以帮助加快我们一些更昂贵的查询(并最终使用 Neo4j 作为主要数据存储而不是 mysql).
我正在尝试将所有节点及其属性存储在 Neo4j 中,并通过 HAS_FATHER
和 HAS_MOTHER
关系连接它们。这是一个好方法吗?使用 HAS_PARENT
并将每个关系上的 parent_type
属性 设置为 father
或 mother
是否更有益?我是否还应该在所有 parents 上保存一个名为 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)
如有任何帮助或提示,我们将不胜感激。谢谢!
使用 HAS_MOTHER
和 HAS_FATHER
而不是类型 属性 的 HAS_PARENT
肯定更好。在更详细的关系的情况下,例如当您查询母亲时,您的遍历不需要挖掘属性——它们可以完全依赖于关系。
性能更高的原因是属性是按需延迟加载的,请参阅 http://neo4j.com/docs/stable/performance-guide.html#_neo4j_primitives_lifecycle。
如果你有语义相反的关系,你不必明确地为它们建模,因为如果 a 是 b 的母亲,则 b 是 a 的儿子。因此,对于查询子项,只需按照相反方向的 HAS_FATHER
和 HAS_MOTHER
即可。
我刚开始玩 Neo4j,如果这是一个简单的概念,我深表歉意...
我正在构建一个相对较大的家庭信息数据库(几百万个节点,每个节点大约有 5-15 个属性)。截至目前,所有数据都存储在使用 Redis 作为缓存层的 mysql 数据库中,但我正在尝试将 Redis 切换为 Neo4j 以帮助加快我们一些更昂贵的查询(并最终使用 Neo4j 作为主要数据存储而不是 mysql).
我正在尝试将所有节点及其属性存储在 Neo4j 中,并通过 HAS_FATHER
和 HAS_MOTHER
关系连接它们。这是一个好方法吗?使用 HAS_PARENT
并将每个关系上的 parent_type
属性 设置为 father
或 mother
是否更有益?我是否还应该在所有 parents 上保存一个名为 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)
如有任何帮助或提示,我们将不胜感激。谢谢!
使用 HAS_MOTHER
和 HAS_FATHER
而不是类型 属性 的 HAS_PARENT
肯定更好。在更详细的关系的情况下,例如当您查询母亲时,您的遍历不需要挖掘属性——它们可以完全依赖于关系。
性能更高的原因是属性是按需延迟加载的,请参阅 http://neo4j.com/docs/stable/performance-guide.html#_neo4j_primitives_lifecycle。
如果你有语义相反的关系,你不必明确地为它们建模,因为如果 a 是 b 的母亲,则 b 是 a 的儿子。因此,对于查询子项,只需按照相反方向的 HAS_FATHER
和 HAS_MOTHER
即可。