2015-10-21 24 views
2

我有多个源自节点的关系。这些关系中的每一个都具有相同的标签。这些关系指向一个子节点(不是唯一唯一的)。在我通过这个关系标签获取链接到父项的所有子节点后,我通过一个名为trueindex的关系属性对它们进行了排序。然后我有一系列节点,我的客户端可以按照正确的排序顺序进行迭代。CYPHER在创建时存储同一标签的节点关系的顺序

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

我认为这样做的唯一方法是首先删除源于父级的特定标签的所有关系。然后重写整个数组(为了反映正确的顺序,使用所有预先存在的关系将它们的trueindex增加一)。这对于小案例来说很好,但是如果我计划让父节点拥有大量关系,那么每次我想要添加,删除索引,流行等时,都需要重写整个数组(关系集)。但仍然保持源自父节点的关系的顺序。

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

非常感谢您的建议,您可以提供。

回答

2

尝试保持链接列表中的子节点。该结构将类似于

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

这样可保持你的孩子节点的顺序,并允许您改善与结构之间的互动方式有两种:

  1. 插入一个新的节点进入这个结构只涉及节点前往的地方“之前”和“之后”的关系的变化,而不是整个结构。例如,插入和c2newc之间c1,删除r2,创建newc和创建c1newc:NEXT关系到c2。类似于其他操作:所有的改动现在都在结构中。

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

要从此结构看一个孩子,你现在用你的trueindex申报的深度在该链表找到节点,即

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

,并检索其所有的孩子

MATCH (parent:Parent {parentId: 1234})-[:CHILDREN|NEXT*]->(child) 
RETURN parent, COLLECT(child) as children 
+0

如果一个孩子节点可以有多个父节点(即在同一个关系标签的多个“数组”中有特征),那么如何管理:Next标签以反映每个父母的数组的成员资格? –

+0

@BenjaminMcFerren当链接列表彼此交叉,即共享一个节点,然后标记每个唯一链表的NEXT关系时,可以为每个链表保留父节点的id作为NEXT的属性。 –

+0

谢谢@ S.D。和jjaderberg。我现在试图从你的建议中写出一个不移位的查询,但是我对条件部分有问题。我试过CASE,但它似乎只与RETURN或WITH具体值有关,而不是允许我在条件下执行CREATE。我试图创建链接列表中的第一个链接,当这产生零结果:MATCH a- [rel:RELTYPE] - > b n.id = {_ parentnodeid},如果它产生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的答案,保留一个链表来表示一个数组会更简单。

相关问题