链接列表中的neo4j OPTIONAL MATCH非常奇怪的行为

时间:2016-01-21 15:56:24

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

它运作良好。

但是当我尝试将一些与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上显示结果,结果如下:

query results

似乎用re填充数据库的所有值。

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

您观察到的行为有两个原因:

  1. WHERE子句仅过滤其前面的 MATCH子句。
  2. 无法匹配的OPTIONAL MATCH子句不会删除先前MATCH子句中的任何结果。
  3. 您的第一个MATCH子句与所有相邻re个节点匹配(因为它不会紧跟一个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