我创建

时间:2015-10-21 15:52:27

标签: neo4j cypher

我有多个源于节点的关系。这些关系中的每一个都具有相同的标签。关系指向子节点(不一定是唯一的)。在我通过此关系标签获取链接到父节点的所有子节点之后,我通过名为trueindex的关系属性对它们进行排序。然后我有一个节点数组,我的客户端可以按正确的排序顺序迭代。

当我尝试“推,弹,取,等......”到这个阵列上时,问题出现了。如果我想在订单的前面添加一个新的关系,我必须创建一个新的关系,用它来链接父节点到子节点,然后在关系trueindex属性中添加一个0值。问题是已经存在与trueindex值为零的关系,我需要执行一些casecading函数来增加所有其他关系的trueindex(所有其他关系都来自同一父节点)。我试图找到一种方法来获得免费的“数组式”索引号功能

我能想到的唯一方法是首先删除源自父级的特定标签的所有关系。然后重写整个数组(所有先前存在的关系,将其trueindex增加1),以反映正确的顺序。这适用于小的情况,但如果我计划父节点有大量的关系,那么每次我想要添加时,重写整个数组(关系集),通过索引删除,弹出等等都是一个问题但仍保持源自父节点的关系顺序。

在创建新关系时,Neo4j是否具有某种关系功能以写入正确的顺序?

我非常感谢您提供的建议。

2 个答案:

答案 0 :(得分:2)

尝试将子节点保留在链接列表中。结构看起来像

(p:Parent)-[r1:CHILDREN]->(c1:Child)-[r2:NEXT]->(c2:Child)-[r3:NEXT]->(c3:Child)

这可以维护子节点的顺序,并允许您以两种方式改善与结构的交互:

  1. 在此结构中插入新节点只会涉及到'之前的关系变更。和'之后'节点的位置,而不是整个结构。例如,要在newcc1之间插入c2,请删除r2,创建newc并从{{1}创建:NEXT关系} c1newc。类似于其他操作:您所有的更改现在都在结构中。

  2. 您可以使用关系及其类型来构建数据,而不是关系属性。这更灵活,几乎总是更高效(有时候性能更高)。

  3. 要从此结构中读取单个子项,您现在使用c2来声明链接列表中要查找节点的深度,即

    trueindex

    并检索包含其所有子项的父级

    MATCH (parent:Parent {parentId: 1234})-[:CHILDREN]->()-[:NEXT*3]->(child)
    RETURN child
    

答案 1 :(得分:1)

您可以先使用SET增加或减少现有关系的属性。

以下示例移动现有关系的trueIndex并在索引0处推送新关系(到现有子节点):

MATCH (n:Root)-[r:HAS]->(c:Child) 
WHERE id(n) = 0 
SET r.trueIndex = r.trueIndex + 1
WITH n, min(r.trueIndex) as indexStart, max(r.trueIndex) as indexEnd
CREATE (n)-[r:HAS  {trueIndex:(indexStart-1)}]->(c:Child)
WHERE id(c) = 12
RETURN n,r,c

您可以根据需要修改查询。

设计明智,我同意@jjaderberg的回答,保持链表代表数组会更简单。