我正在使用Neo4j设计扩展的家谱。 在设计关系时,我提出了两种方法:
CREATE (p:Person)-[:PARENT_OF]->(s:Person)
CREATE (p:Person)-[:STEPPARENT_OF]->(s:Person)
CREATE (p:Person)-[:MARRIED_TO]->(s:Person)
通过这种方法,我为每个案例创建了不同的关系(请记住,会有很多案例=很多关系)
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)
采用这种方法会减少关系,但设计有点混乱。
我想知道哪种方法更好,为什么?
答案 0 :(得分:3)
您选择的是beetwen细粒度(:PARENT_OF
,:STEPPARENT_OF
,:MARRIED_TO
)或一般关系(:PARENT_OF {type:'natural'}
,:PARENT_OF {type:'step'}
,:SPOUSE_OF {type:'marriage'}
)。
By Ian Robinson,Jim Webber和EmilEifrém撰写的图表数据库(可在Neo4j网站上download获得)中说:
按关系名称区分是消除的最佳方式 来自遍历的大图。使用一个或多个 属性值决定是否遵循关系 第一次访问这些属性时会产生额外的I / O,因为 属性驻留在一个单独的商店文件中 关系(之后,它们被缓存)。
请记住,应该根据应用程序需求构建图形数据库模型。也就是说:它主要取决于您向数据库询问的查询类型。
type
,可能最好将其拆分为单独的关系类型。