如何按顺序存储节点?

时间:2014-11-25 10:19:39

标签: neo4j data-modeling

我正在使用neo4j 2.1.5并且绑定模拟节点是视频链接的场景,并且它们属于多个类别和子类别,但是这些节点也将在特定序列类别下形成有序序列。 e.g;

Sequence 1: (node 1)-[:relatedTo]->(node 2)->[:relatedTo]->(node 3)-[:relatedTo]->(node 4)

Sequence 2: (node 2)-[:someRel]->(node 8)->[:someRel]->(node 4)

对此进行建模的最佳方法是什么? 注意:将在节点之间的序列类别中添加更多视频节点。

1 个答案:

答案 0 :(得分:0)

你这样做的方式对我来说很好。一组节点,它们之间具有关系,基本上形成一个队列。你在这里做的基本上是使用neo4j来建模linked list

与该类别的联系可能会让它变得有趣。使用链接列表,通过它们很容易,但随机访问(跳到中间)很难。现在,如果订单始终是固定的,您可以在关系中添加seq属性,并以数字方式标记它们(0,1,2 ......)。然后,您可以通过查询相应的seq值来跳转到任何位置。 但是,如果您说要在列表中进行动态插入,这可能是一个糟糕的主意。如果您创建新的#3,则意味着您必须增加所有后续seq个数字。所以这可能不起作用。

可能只是一个始终保证链接到序列中第一项的Category节点是一个很好的方法,如下所示:

(c:Category {name:"Horror"})-[:contains]->(v1:Video {name: "Texas Chainsaw Massacre"})-[:next]->(v2:Video { name: "Hellraiser"});

您可以根据需要执行尽可能多的:next关系。要插入新内容,您可以这样做:

MATCH (v1:Video {name: "Texas Chainsaw Massacre"})-[r:next]->(v2:Video {name: "Hellraiser"})
CREATE v1-[:next]->(v3:Video {name: "New Thing I'm inserting"}-[:next]->v2
DELETE r;

另一种方法是,您可以将类别链接到每个视频(而不仅仅是第一个视频)。您的视频仍然会有订单,并且您可以通过视频名称随机访问来跳转到它们,但您不会知道列表头部的位置。