"有序列表"和双向与单向的关系

时间:2015-02-08 17:11:29

标签: neo4j relationships

我是Neo4j新手,目前只是在浏览器中为项目编制数据。

这是我的用例:用户可以拥有一堆项目。每个项目都由故事情节描述。

(:User)-[:OWNS]->(:Item)<-[:DESCRIBES]-(:Storyline)

到目前为止没有问题。然而,故事情节需要包含“卡片”,基本上是故事的章节,需要按顺序排列。所以,我的第一个念头就是这个。

(:Storyline)<-[:FOLLOWS]<-(a:Card)<-[:FOLLOWS]-(b:Card)

但是,如果我们从卡B开始,我们现在必须按照路径返回以查看卡所属的故事情节/项目。似乎效率低下。这样做会更好吗?

(a:Card {order: 0})-[:BELONGS_TO]->(:Storyline)
(b:Card {order: 1})-[:BELONGS_TO]->(:Storyline)

或者,我是否可以删除故事情节,只是有以下内容?

(:Card {order:0})-[:DESCRIBES]->(:Item)

接下来,用户应该可以自由创建指向属于他自己或任何其他用户项目的另一个故事情节卡片的链接。

(storyA:Card)-[:LINKS_TO]->(storyB:Card)

然而,故事B的所有者可能想也可能不希望链接回第一个人的故事。我知道您可以通过执行以下操作来忽略密码查询中关系的方向:

(a)-[r]-(b)

但我读到,明确地创建双向关系通常是一个坏主意。因此,如果storyB想要链接回来,您最好如何在数据模型中表示这一点?也许是另一种关系类型,例如:LINKS_MUTUALLY或者什么,或者:LINKS_TO关系中的“共同”布尔属性?

1 个答案:

答案 0 :(得分:0)

关于你的第一个问题,在这种情况下通常更好的是拥有关系而不是属性。

我会投入FIRSTLAST关系,就像在此TimeTree中一样,并将其建模为:

(a:Card)-[:DESCRIBES]->(i:Item)
(b:Card)-[:DESCRIBES]->(i:Item)
(c:Card)-[:DESCRIBES]->(i:Item)
(a:Card)<-[:FOLLOWS]-(b:Card)
(b:Card)<-[:FOLLOWS]-(c:Card)
(a:Card)<-[:FIRST_CARD]-(i:Item) //optional, for easy navigation
(c:Card)<-[:LAST_CARD]-(i:Item)  //optional, for easy navigation

对于双向关系,如果一个方向上的关系暗示另一个方向,则唯一不好的想法。在您的情况下,情况并非如此,因此创建(storyA:Card)-[:LINKS_TO]->(storyB:Card)(storyA:Card)<-[:LINKS_TO]-(storyB:Card)完全没问题,因为每个关系都有不同的原因。