【发布时间】:2019-06-20 16:27:02
【问题描述】:
我有一个图表,其中一些节点是由于应用程序中的错误而创建的。 我想删除那些节点(它们代表一个日志),但我不知道如何循环遍历这些节点。
我不知道如何访问路径集合中的节点,我需要这样做才能将一个节点与另一个节点进行比较。
match (o:Order{id:123})
match (o)-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)
with collect((l:Log)-[:STATUS]->(os:OrderStatus)) as logs
我想访问路径中的每个节点以执行比较。每个订单通常有 5 或 6 个 (l)-[:STATUS]->(os)。
如何访问每条路径的 (l) 和 (os) 节点,以比较它们的属性?
例如,如果我在其中一个订单中有此路径集合:
(log1)-[:STATUS]->(os1)
(log2)-[:STATUS]->(os2)
(log3)-[:STATUS]->(os3)
(log4)-[:STATUS]->(os2)
(log5)-[:STATUS]->(os4)
所以,从上面的路径集合中,我想分离删除(log4),因为(os2)节点低于前一个(os3)节点,应该更大。
然后,我想将 (log3) 附加到 (log5)
注意:每个 (os) 节点都有一个表示“状态”的 id,从 1 到 5。此外,(log) 节点按创建的日期时间排序。
知道如何做到这一点吗?提前谢谢你们!
编辑
我没有提到我遇到的其他一些情况。这是其中之一:
根据@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;
此查询适用于所有场景。
【问题讨论】: