我有多个源于节点的关系。这些关系中的每一个都具有相同的标签。关系指向子节点(不一定是唯一的)。在我通过此关系标签获取链接到父节点的所有子节点之后,我通过名为trueindex的关系属性对它们进行排序。然后我有一个节点数组,我的客户端可以按正确的排序顺序迭代。
当我尝试“推,弹,取,等......”到这个阵列上时,问题出现了。如果我想在订单的前面添加一个新的关系,我必须创建一个新的关系,用它来链接父节点到子节点,然后在关系trueindex属性中添加一个0值。问题是已经存在与trueindex值为零的关系,我需要执行一些casecading函数来增加所有其他关系的trueindex(所有其他关系都来自同一父节点)。我试图找到一种方法来获得免费的“数组式”索引号功能
我能想到的唯一方法是首先删除源自父级的特定标签的所有关系。然后重写整个数组(所有先前存在的关系,将其trueindex增加1),以反映正确的顺序。这适用于小的情况,但如果我计划父节点有大量的关系,那么每次我想要添加时,重写整个数组(关系集),通过索引删除,弹出等等都是一个问题但仍保持源自父节点的关系顺序。
在创建新关系时,Neo4j是否具有某种关系功能以写入正确的顺序?
我非常感谢您提供的建议。
答案 0 :(得分:2)
尝试将子节点保留在链接列表中。结构看起来像
(p:Parent)-[r1:CHILDREN]->(c1:Child)-[r2:NEXT]->(c2:Child)-[r3:NEXT]->(c3:Child)
这可以维护子节点的顺序,并允许您以两种方式改善与结构的交互:
在此结构中插入新节点只会涉及到'之前的关系变更。和'之后'节点的位置,而不是整个结构。例如,要在newc
和c1
之间插入c2
,请删除r2
,创建newc
并从{{1}创建:NEXT
关系} c1
到newc
。类似于其他操作:您所有的更改现在都在结构中。
您可以使用关系及其类型来构建数据,而不是关系属性。这更灵活,几乎总是更高效(有时候性能更高)。
要从此结构中读取单个子项,您现在使用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的回答,保持链表代表数组会更简单。