2017-08-11 146 views
2

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

用例是这样的:

  • 我有一大堆的问题,比如“我们应该看到什么电影?”
  • 每个问题可以有很多选项,如“电影1”,“电影2”等。
  • 对于每个问题,我希望用户能够投票支持他们最喜欢的选项。

该图将优选是这个样子:

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

我认识到,一个办法可以解决这个问题是以下几点:

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

不过,如果我决定删除Movie作为Option在未来,我不会利用DETACH,并将不得不管理我自己删除Vote关系。更何况,如果Movie属于多个类别,我必须跟踪它属于哪个Question->Movie关系(可能带有某种类型的ID)。它似乎很混乱...

是可以创建一个关系的关系?或者我将不得不手动强制引用完整性?

+0

任何机会,你可以编辑的问题,提供一些真实的例子?我不确定如何解释类​​别/选项/事物/投票模式。 –

+0

当然可以。 –

回答

1

是否可以创建一个关系的关系?

不,这是不可能的。据the docs

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

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

我相信你应该对你的数据模型做一些改变。例如:

也许Option可以是节点而不是关系。更有意义,不是吗?通过这种方式:

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

此外,Vote可以是一个节点过了,没有关系......这样一来,当用户使得(?的关系,安贞焕)投票,这次投票节点将引用选项及其相关的类别。

(: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

有意义 - ASCII艺术比我的更好! :D –

+0

@JimHeising哈哈谢谢队友! –

+1

我希望自己能够不必管理引用完整性,因为在您的示例中,如果删除了类别或选项,我仍然必须删除投票节点。正确?但至少它可以解决参考ID问题,这是一个很好的功能。 –