链接列表中neo4j可选匹配的行为非常奇怪
我有一种链表结构:链接列表中neo4j可选匹配的行为非常奇怪,neo4j,cypher,Neo4j,Cypher,我有一种链表结构: (root:`Desk`)-[:linked_list*0..]->(article:`Article`)-[:linked_list]->...-[:linked_list]->(root:`Desk`) 要查询列表中的所有元素,我使用以下查询: MATCH (r)-[:linked_list]->(e) WHERE ID(r) = {r_id} AND r <> e RETURN e 我试图将结果可视化,结果如下: 它似乎用
(root:`Desk`)-[:linked_list*0..]->(article:`Article`)-[:linked_list]->...-[:linked_list]->(root:`Desk`)
要查询列表中的所有元素,我使用以下查询:
MATCH (r)-[:linked_list]->(e)
WHERE ID(r) = {r_id}
AND r <> e
RETURN e
我试图将结果可视化,结果如下:
它似乎用数据库的所有值填充r
和e
知道为什么会这样吗?我相信你真正想做的是这样的事情。找到
链接列表
项,然后对每个e
匹配项执行可选匹配
MATCH (r)-[:linked_list]->(e)
WHERE ID(r) = {r_id}
AND r <> e
WITH e
OPTIONAL MATCH (e)-[:author]->(a:`User`)
RETURN e, collect(a) as authors
匹配(r)-[:链接列表]->(e)
其中ID(r)={r_ID}
和r e
带e
可选匹配(e)-[:author]->(a:`User`)
返回e,以作者身份收集(a)
您观察到的行为有两个原因:
WHERE
子句仅过滤其前一个MATCH
子句可选匹配
子句不会从先前的匹配
子句中删除任何结果MATCH
子句匹配all相邻的r
和e
节点(因为它后面没有紧跟WHERE
子句)
第二个MATCH
子句由WHERE
子句过滤。但是,由于它是一个可选匹配
子句,未能满足WHERE
子句不会消除第一个匹配
找到的任何匹配
因此,您需要将WHERE
子句放在第一个MATCH
子句之后(类似于@DaveBennett的答案),以便执行您想要的筛选
MATCH (r)-[:linked_list]->(e)
WHERE ID(r) = {r_id}
AND r <> e
WITH e
OPTIONAL MATCH (e)-[:author]->(a:`User`)
RETURN e, collect(a) as authors