我有一个有序列表
(父) - [: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个节点。
答案 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
关系扫描项目以找到可能的尾部,因为您无论如何都要遍历可变长度关系,以找到路径中的节点:只进行遍历,只包括无法扩展的路径。