使用标签和关系设计Neo4J数据模型

时间:2017-08-09 17:33:49

标签: neo4j graph-databases

这是一个设计问题,需要有关性能和维护注意事项的指导原则。

标签是否可以表明与其他节点/标签的关系?

Approach-1: 
create (n:Actor:Director {name:'Clint Eastwood'})
create (n:Movie {name:'Gran Torino'})

MATCH (a:Actor {name:'Clint Eastwood'}), (m:Movie {name:'Gran Torino'})
CREATE (a)-[:ACTED_IN]->(m)

在这种情况下,Actor / Director实际上是一个人与Movie节点的关系。那么如果这个人同时是电影中的演员和导演,那么它是否应该被创建为具有与电影节点的两个关系的Person节点?

Approach-2: 
create (n:Person {name:'Clint Eastwood'})
create (n:Movie {name:'Gran Torino'})

MATCH (p:Person {name:'Clint Eastwood'}), (m:Movie {name:'Gran Torino'})
CREATE (p)-[:ACTOR]->(m)

MATCH (p:Person {name:'Clint Eastwood'}), (m:Movie {name:'Gran Torino'})
CREATE (p)-[:DIRECTOR]->(m)

方法-2在工程方面似乎更好,但是Neo4J示例文档也引用了方法-1(参考:https://neo4j.com/developer/kb/how-do-i-report-on-nodes-with-multiple-labels/

从长远来看,哪一个更干净,更好,更有效?

1 个答案:

答案 0 :(得分:1)

通常,标签用于对节点进行分组,并指示节点在整个图中表示的角色。

你指出的例子表明克林特·伊斯特伍德是演员组的一部分,也是导演组的一部分。这并不意味着他扮演的角色是“演员”“导演”。他工作的电影。在示例中,克林特·伊斯特伍德扮演并执导了“格兰都灵”。但是如果你需要在克林特·伊斯特伍德和他只扮演的电影之间建立关系,你会怎么做?

更干净,更好,更有效的方法取决于您的域名以及您在做什么。也许两者兼而有之是一个很好的意识形态。

如果在任何时候您需要查询您的数据库以寻找演员或导演,我相信使用标签:Actor:Director对这些节点进行分组是一个很好的理想选择。如果没有,您不需要这些标签。另外,我建议您使用该关系来指出:Person:Movie之间关系的含义。也就是说,()-[:ACTED_IN]->()()-[:DIRECTED]->()等关系。