是否可以在Neo4j中建立与关系的关系?
用例如下:
图表最好如下所示:
(:Question {name:"What movie?"})-[:Option]->(:Movie {name:"Movie1"})
^
|
[:Vote]
|
(:User)
我意识到我可以通过以下方式解决这个问题:
(:Question)-[:Option]->(:Movie)<-[:Vote]-(:User)
但是如果我决定将Movie
作为Option
移除,我将无法利用DETACH
并且必须管理移除Vote
我自己的关系。更不用说,如果Movie
属于多个类别,我必须跟踪它所属的Question->Movie
关系(可能带有某种ID)。它看起来很乱......
是否可以与关系建立关系?或者我将不得不手动强制执行参照完整性?
答案 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,或者在关系的情况下,其连接端点标识符的哈希码)。