【问题标题】:Designing Neo4J Data Model with Labels and Relationships使用标签和关系设计 Neo4J 数据模型
【发布时间】:2018-01-17 17:29:03
【问题描述】:

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

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

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/

那么从长远来看,哪一个更清洁、更好、更高效?

【问题讨论】:

    标签: neo4j graph-databases


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多