Cypher查询有序列表

时间:2016-09-20 08:01:36

标签: list neo4j cypher

我有一个有序列表

(父) - [:NEXT] - GT;(项目) - [:NEXT] - GT;(项目)... [:NEXT] - >(项目)

我正在尝试找出有效的密码查询来查找所有项目。关系:NEXT只从一个项目到下一个项目,永远不会重复,我不会有一个周期。

这是我的密码查询

START n=node(nodeId) MATCH (n)-[r:NEXT*]->(m:ListItem) RETURN distinct(m)

这有效但即使对于包含10个项目的列表也非常慢,因为它显然是在查询周围。对于长度为3且*替换为* 1..3并且已删除的列表,我有45个节点。我真的不明白为什么。不同的是,我认为我应该得到3个节点。

2 个答案:

答案 0 :(得分:1)

这是有效地做到这一点的答案(假设所有列表项都按关系链接到父LIST_ITEM

MATCH (n) WHERE id(n)={nodeId} WITH n
      MATCH (n)-[:LIST_ITEM]-(m:ListItem) WHERE NOT (m)-[:NEXT]->() 
      WITH n, m 
      MATCH path = (n)-[:NEXT*]->(m) 
      RETURN FILTER (a in nodes(path) WHERE ANY (l in labels(a) WHERE l="ListItem")) 
      LIMIT 1

欢迎更简单的查询

答案 1 :(得分:0)

要重新解决您的问题,您在遍历:NEXT关系时会查找其中一条完整路径,但不一定是最长路径。根据您自己的答案中的查询,不清楚遍历:NEXT关系是否总是导致ListItem个节点。

您的查询可以简化为:

MATCH p = (head:ListItem)-[:NEXT*]->(tail:ListItem)
WHERE id(head) = {nodeId}
  AND NOT (tail)-[:NEXT]->()
RETURN filter(n IN nodes(p) WHERE n:ListItem)
LIMIT 1

或者甚至,如果路径中只有ListItem个节点:

MATCH p = (head:ListItem)-[:NEXT*]->(tail:ListItem)
WHERE id(head) = {nodeId}
  AND NOT (tail)-[:NEXT]->()
RETURN nodes(p)
LIMIT 1

无需通过:LIST_ITEM关系扫描项目以找到可能的尾部,因为您无论如何都要遍历可变长度关系,以找到路径中的节点:只进行遍历,只包括无法扩展的路径。