如何访问路径集合中的节点对象? (两个或多个节点的路径)

时间:2019-06-20 16:27:02

标签: neo4j cypher

我有一个图形,其中一些节点是由于应用程序中的错误而创建的。 我想删除这些节点(它们代表一个日志),但是我不知道如何循环通过这些节点。

我不知道如何访问路径集合中的节点,我需要这样做才能将一个节点与另一个节点进行比较。

match (o:Order{id:123})
match (o)-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)

with collect((l:Log)-[:STATUS]->(os:OrderStatus)) as logs

我想访问路径中的每个节点以进行比较。每个订单通常在(l)-[:STATUS]->(os)中有5或6。

如何访问每个路径的(l)和(os)节点,以比较它们的属性?

例如,如果我在一个订单中包含以下路径集合:

scenario1

(log1)-[:STATUS]->(os1)

(log2)-[:STATUS]->(os2)

(log3)-[:STATUS]->(os3)

(log4)-[:STATUS]->(os2)<-这是错误

(log5)-[:STATUS]->(os4)

因此,从上述路径的集合中,我想分离删除(log4),因为(os2)节点低于上一个(os3),并且应该更大。

然后,我想将(log3)附加到(log5)


注意:每个(os)节点都有一个代表“状态”的ID,从1到5。此外,(日志)节点按创建的日期时间排序。


关于如何执行此操作的任何想法?预先谢谢你们!



编辑

我没有提到其他一些情况。这是其中之一:

scenario 2

基于@cybersam的答案,我发现了解决方法。

我必须运行2个单独的查询才能使其工作,但是原理相同,如下所示:

创建新关系:

MATCH(o:Order)-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)
WHERE SIZE((o)-[:STATUS_CHANGE*]->()-[:STATUS]->(os)) >= 1
WITH o, os, COLLECT(l)[0] AS keep
WITH o, collect(keep) AS k
FOREACH(i IN range(0,size(k)-1)   | 
FOREACH(a IN [k[i]]               | 
FOREACH(b IN [k[i+1]]             | 
FOREACH(c IN CASE WHEN b IS NOT NULL THEN [1] END | MERGE (a)-[:STATUS_CHANGE]->(b) ))));

删除超出的节点:

MATCH(o:Order)-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)
WHERE (os)<-[:STATUS]-()-[:STATUS_CHANGE*]->(l)-[:STATUS]->(os)
WITH o, os, COLLECT(l) AS exceed
UNWIND exceed AS del
detach delete del;

此查询适用于每种情况。

1 个答案:

答案 0 :(得分:2)

假设所有错误都遵循相同的模式(不需要的Log节点始终引用“较旧的” OrderStatus),这可能对您有用:

MATCH (o:Order{id:123})-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)
WHERE SIZE(()-[:STATUS]->(os)) > 1
WITH os, COLLECT(l) AS logs
UNWIND logs[1..] AS unwanted
OPTIONAL MATCH (x)-[:STATUS_CHANGE]->(unwanted)-[:STATUS_CHANGE]->(y)
DETACH DELETE unwanted
FOREACH(ignored IN CASE WHEN x IS NOT NULL THEN [1] END | CREATE (x)-[:STATUS_CHANGE]->(y))

此查询:

  • (按顺序)查找具有多个OrderStatus关系的所有相关STATUS节点。
  • 使用aggregating function COLLECT收集(依次)与每个Log节点相关的OrderStatus节点。
  • 使用UNWIND logs[1..]获取各个不需要的Log节点。
  • 在删除不需要的节点后,使用OPTIONAL MATCH获取可能需要连接在一起的2个节点。
  • 使用DETACH DELETE删除每个不需要的节点及其关系。
  • 使用FOREACHOPTIONAL MATCH可能已经建立的一对节点连接在一起。