这是一个设计问题,需要有关性能和维护注意事项的指导原则。
标签是否可以表明与其他节点/标签的关系?
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/)
从长远来看,哪一个更干净,更好,更有效?
答案 0 :(得分:1)
通常,标签用于对节点进行分组,并指示节点在整个图中表示的角色。
你指出的例子表明克林特·伊斯特伍德是演员组的一部分,也是导演组的一部分。这并不意味着他扮演的角色是“演员”和“导演”。他工作的电影。在示例中,克林特·伊斯特伍德扮演并执导了“格兰都灵”。但是如果你需要在克林特·伊斯特伍德和他只扮演的电影之间建立关系,你会怎么做?
更干净,更好,更有效的方法取决于您的域名以及您在做什么。也许两者兼而有之是一个很好的意识形态。
如果在任何时候您需要查询您的数据库以寻找演员或导演,我相信使用标签:Actor
和:Director
对这些节点进行分组是一个很好的理想选择。如果没有,您不需要这些标签。另外,我建议您使用该关系来指出:Person
和:Movie
之间关系的含义。也就是说,()-[:ACTED_IN]->()
和()-[:DIRECTED]->()
等关系。