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

Designing Neo4J Data Model with Labels and Relationships

这是一个设计问题,需要一个性能和维护注意事项指南。

标签表明与其他人的关系是否可取node/label?

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)

在这种情况下,演员/导演实际上是一个人与一个电影节点的关系。那么,如果这个人既是电影中的演员又是导演,是否应该将其创建为与电影节点具有两种关系的 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)

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

那么在漫长的运行中,哪个更干净、更好、更高效呢?

标签一般用于对节点进行分组,表示节点在整个图中所代表的角色。

你举的例子表明克林特伊斯特伍德是演员组的一部分,也是导演组的一部分group.This并不意味着他扮演"actor" "director" 在他工作的所有电影中。在示例中,克林特·伊斯特伍德 (Clint Eastwood) 担任并执导了 'Gran Torino'。但是如果你需要在克林特伊斯特伍德和他只演过的电影之间建立关系,你会怎么做?

更干净、更好、更高效的方法取决于您的领域和您在做什么。也许两者结合是个好主意。

如果在任何时候您需要查询数据库以查找演员或导演,我认为使用标签 :Actor:Director 对这些节点进行分组是个好主意。如果没有,则不需要这些标签。此外,我建议您使用关系来表示:Person:Movie 之间的关系的含义。也就是说,像 ()-[:ACTED_IN]->()()-[:DIRECTED]->().

这样的关系