2017-08-09 59 views
1

这是一个设计问题,需要一个关于性能和维护注意事项的指导。使用标签和关系设计Neo4J数据模型

是否建议标签指示与其他节点/标签的关系?

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节点的关系。那么,如果这个人既是电影中的演员又是导演,那么它是否应该创建为具有与电影节点两种关系的人节点?

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的示例文档还referes接近-1(参照https://neo4j.com/developer/kb/how-do-i-report-on-nodes-with-multiple-labels/

所以哪一个是清洁器,更好和更有效的,从长远来看?

回答

1

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

由你所指出的例子表明,克林特·伊斯特伍德是董事group.This的演员组和部分并不意味着他扮演他的作品的所有电影角色“演员” “导演”。在这个例子中,克林特伊斯特伍德扮演并指导了“格兰托里诺”。但是如果你需要在克林特伊斯特伍德和他只演过的电影之间建立关系,你会怎么做?

更清洁,更好,更高效的方法取决于你的域名和你在做什么。也许两者的结合都是一个好理想。

如果在任何时间点您都需要查询您的数据库寻找演员或导演,我相信这是使用标签:Actor:Director对这些节点进行分组的好理想。如果不是,你不需要这些标签。此外,我建议您使用这种关系来指示:Person:Movie之间的关系的含义。也就是说,像()-[:ACTED_IN]->()()-[:DIRECTED]->()这样的关系。