Neo4j:如何建模作为节点的关系属性?

时间:2014-06-18 11:30:28

标签: neo4j reification

假设我有一个简单的关系,比如

CREATE (a:Company { name:"Apple" })-[:BUYS]->(b:Company { name:"Beats" })

现在我想收集关于:BUYS关系的元数据 - 用户创建该关系以及确认这一点的来源是什么。为此,我创建了一个新节点并将其他节点连接到它:

MATCH (a:Company { name:"Apple" }),(b:Company { name:"Beats" }) 
CREATE a-[:IS_BUYER]->(ab:Buyout { name:"Apple-Beats" })<-[:IS_SELLER]-b

MATCH (u:User { name:"Fred" }),(n1:Newspaper { name:"Washington Post" }),
   (n2:Newspaper { name:"Financial Times" }),(ab:Buyout { name:"Apple-Beats" }) 
CREATE u-[:CREATED]->ab<-[:CONFIRMED_BY]-n1,ab-[:CONFIRMED_BY]->n2

现在我有几个问题:

  1. 因为在大多数情况下,查询只对:BUYS感兴趣 关系,我保留原样,并为这些查询获得更好的表现,对吗?
  2. 还有其他更好的方法来模拟这个吗?
  3. 为物化节点生成名称/ ID的好方法是什么?
  4. 有没有办法将:BUYS关系的删除级联到相应的:Buyout节点?

1 个答案:

答案 0 :(得分:0)

  1. 您肯定可以保持:BUYS关系。但是,您应首先检查(company)-[:IS_BUYER]->()<-[:IS_SELLER]-(other)关于您的要求是否会减慢速度。做过早优化。
  2. 如果一个关系需要引用另一个&#39;在你的域中,它应该被重构为一个节点 - 这里有很好的建模方法。
  3. 如果中间节点上的任何属性从域视角看起来没有意义,则不需要设置任何属性
  4. 不,Neo4j没有任何级联行为。这需要在应用程序级别实现。