我有一种类型的链表结构:
(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
它运作良好。
但是当我尝试将一些与Article
链接的关系进行可选匹配时,查询确实需要很多,并且我获得了很多奇怪的数据。
MATCH (r)-[:linked_list]->(e)
OPTIONAL MATCH (e)-[:author]->(u:`User`)
WHERE ID(r) = {r_id}
AND r <> e
RETURN e, [collect(a)] as authors
我尝试在http://localhost:7474上显示结果,结果如下:
似乎用r
和e
填充数据库的所有值。
知道为什么会这样吗?
答案 0 :(得分:2)
您观察到的行为有两个原因:
WHERE
子句仅过滤其前面的 MATCH
子句。OPTIONAL MATCH
子句不会删除先前MATCH
子句中的任何结果。您的第一个MATCH
子句与所有相邻r
和e
个节点匹配(因为它不会紧跟一个WHERE
子句)。
您的第二个MATCH
子句按<{1}}子句进行过滤。但是因为它是一个WHERE
子句,不满足OPTIONAL MATCH
子句并不能消除第一个WHERE
找到的任何匹配。
因此,您需要在第一个MATCH
子句(类似@ DaveBennett的答案)之后放置WHERE
子句,以便进行所需的过滤。
答案 1 :(得分:1)
我相信你真正想做的事情就是这样。找到linked_list
项,然后匹配每个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