在Neo4j中建立与关系的关系

时间:2017-08-11 01:10:40

标签: neo4j cypher

是否可以在Neo4j中建立与关系的关系?

用例如下:

  • 我有很多问题,比如“我们应该看哪部电影?”
  • 每个问题可以有很多选项,如“Movie1”,“Movie2”等
  • 对于每个问题,我希望用户能够投票选出他们喜欢的选项。

图表最好如下所示:

(:Question {name:"What movie?"})-[:Option]->(:Movie {name:"Movie1"})
                                     ^   
                                     |
                                  [:Vote]
                                     |
                                  (:User)

我意识到我可以通过以下方式解决这个问题:

(:Question)-[:Option]->(:Movie)<-[:Vote]-(:User)

但是如果我决定将Movie作为Option移除,我将无法利用DETACH并且必须管理移除Vote我自己的关系。更不用说,如果Movie属于多个类别,我必须跟踪它所属的Question->Movie关系(可能带有某种ID)。它看起来很乱......

是否可以与关系建立关系?或者我将不得不手动强制执行参照完整性?

2 个答案:

答案 0 :(得分:1)

  

是否可以与关系建立关系?

没有。这是不可能的。根据{{​​3}}:

  

关系连接两个节点,并保证有效   源节点和目标节点。

即:关系的起点和终点应该是一个节点。

我相信您应该对数据模型进行一些更改。例如:

也许Option可以是节点而不是关系。更有意义,不是吗?这样:

 (:Category)-[:HAS]->(:Option)    

此外,Vote也可以是一个节点,而不是一个关系...这样,当用户使(一种关系,ahn?)投票时,这次投票node将引用该选项及其相对的类别。

 (:Category)-[:HAS]->(:Option)
          \           /
  [:FOR_CATEGORY][:FOR_OPTION]
            \      /
             (:Vote)
                |
            [:MAKES] 
                |
             (:User)

例如,如果您需要删除Option并因此删除与其相关的:Vote,则可以执行以下操作:

MATCH (o:Option {id:10})<-[:FOR_OPTION]-(v:Vote)
DETACH DELETE o
DETACH DELETE v

有道理吗?对不起我的ASCII艺术。 :)

答案 1 :(得分:0)

我正在调查此事。我能找到的唯一合理的方法是为关系分配一个标识符(在您的情况下为 :HAS),然后在指向关系(:VOTE)中使用它。

Neo4j 对此有内部 ID(请参阅 ID() 函数),但我通常更喜欢尝试分配一个语义上有意义的 ID(例如一个人的国民保险号、页面 URL,或者在关系的情况下,其连接端点标识符的哈希码)。