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

标签 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

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

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

例如,如果我在其中一个订单中有此路径集合:

scenario1

(log1)-[:状态]->(os1)

(log2)-[:状态]->(os2)

(log3)-[:状态]->(os3)

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

(log5)-[:状态]->(os4)

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

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


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


知道如何做到这一点吗?提前谢谢你们!



编辑

我没有提到我遇到的其他一些场景。这是其中之一:

scenario 2

根据@cybersam的回答,我找到了解决方法。

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

建立新的关系:

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;

此查询适用于所有场景。

最佳答案

假设您的所有错误都遵循相同的模式(不需要的 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))

此查询:

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

关于neo4j - 如何访问路径集合中的节点对象? (两个或多个节点的路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56690312/

相关文章:

路径之间特定节点标签的 Neo4j 最短路径

neo4j - 当reduce()的where条件不再满足时停止Cypher遍历

node.js - 如果重点关注建模数据,那么哪个(内存中)图形数据库

performance - Neo4J 调优还是更多 RAM?

csv - Neo4j Cypher-使用LOAD CSV创建节点并设置标签

neo4j - 如何从 Neo4J 中的子字符串创建关系

graph - 密码:如何返回不同的关系类型?

graph - Neo4j遍历时节点属性比较

neo4j - 在 LOAD CSV 期间最好使用 CREATE CONSTRAINT

neo4j - 为什么这个密码查询如此慢,只有大约 30 个节点和 50 个关系?