Neo4j家谱关系设计

3
我正在使用Neo4j设计一个扩展的家族谱。在关系设计中,我想到了两种方法:
1. 对于每种情况都创建不同的关系(请记住,将会有很多情况=很多关系): CREATE (p:Person)-[:PARENT_OF]->(s:Person) CREATE (p:Person)-[:STEPPARENT_OF]->(s:Person) CREATE (p:Person)-[:MARRIED_TO]->(s:Person) 2. 创建较少的关系,但是设计有点混乱: CREATE (p:Person)-[r:PARENT_OF {type:'natural'}]->(s:Person) CREATE (p:Person)-[r:PARENT_OF {type:'step'}]->(s:Person) CREATE (p:Person)-[r:SPOUSE_OF {type:'marriage'}]->(s:Person) 我想知道哪种方法更好,为什么?

你的数据将回答哪些问题? - Tomaž Bratanič
他们中的一些可能是: 约翰的父母是谁? 约翰与谁有关系? 约翰有哪些孩子? 约翰离婚了吗? 约翰有收养的孩子吗? - Porjaz
1个回答

3
你要选择细粒度的(:PARENT_OF:STEPPARENT_OF:MARRIED_TO)或者通用关系(:PARENT_OF {type:'natural'}:PARENT_OF {type:'step'}:SPOUSE_OF {type:'marriage'})。根据 Ian Robinson、Jim Webber 和 Emil Eifrém 的书《图形数据库》(可在 Neo4j 网站 下载)所述,通过关系名称进行区分是消除遍历中大量图形的最佳方式。使用一个或多个属性值来决定是否跟随关系会导致额外的 I/O,因为属性位于与关系不同的存储文件中(不过之后它们会被缓存)。请记住,图形数据库模型应该建立在应用程序需求的基础上。也就是说,这基本上取决于您向数据库提出了什么类型的查询。如果需要在图形遍历查询中评估关系的类型,则将其拆分为单独的关系类型可能是一个好主意。否则,将其保留为通用关系类型的属性即可。

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