cypher NOT IN查询可选匹配

时间:2016-09-12 14:59:24

标签: neo4j cypher graph-databases

不相关 - 跳到重要编辑。

我有以下查询:

MATCH (n)
WHERE (n:person) AND n.id in ['af97ab48544b'] // id is our system identifier
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m)
WHERE (m:person OR m:dog OR m:cat)
RETURN n,r,m

此查询返回与特定人物有关系的所有人,狗和猫。我想把它翻过来接收所有的节点和放大器。不包含在此查询结果中的关系。

如果是SQL,那将是

select * from graph where id NOT IN (my_query)

我认为OPTIONAL MATCH是有问题的部分。我怎么能这样做? 有什么建议吗?

感谢。

- 重要编辑 -

嘿伙计们,抱歉改变我的问题,但我的要求已经改变了。我需要将整个图形(所有节点和关系)连接起来并断开连接,除了特定节点的ID。以下查询正在运行,但仅适用于单个id,如果有更多ID,则无效。

MATCH (n) WHERE (n:person)
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m) WHERE (m:person OR m:dog OR m:cat)
WITH n,r,m
MATCH (excludeNode) WHERE excludeNode.id IN ['af97ab48544b']
WITH n,r,m,excludeNode WHERE NOT n.id = excludeNode.id AND (NOT m.id = excludeNode.id OR m is null)
RETURN n,m,r

或者我尝试了更简单的查询:

MATCH (n) WHERE (n:person) AND NOT n.id IN ['af97ab48544b'] return n

但是这个没有返回关系(记住我也需要断开连接的节点)。

如何让整个图表排除特定节点?这包括节点和关系,连接节点以及断开连接。

2 个答案:

答案 0 :(得分:1)

您必须切换查询的“视角”...首先循环遍历每个节点,然后修剪连接到您的人的节点。

MATCH (bad:person) WHERE bad.id IN ['af97ab48544b']
WITH COLLECT(bad) AS bads
MATCH path = (n:person) - [r:friend|:connected|:owner] -> (m)
WHERE n._id = '' AND (m:person OR m:cat OR m:dog) AND NOT ANY(bad IN bads WHERE bad IN NODES(path))
RETURN path

也就是说,这是一个更适合SQL而不是图形的问题。任何时候你必须使用标签遍历每个节点,你处于关系区域,图表效率会降低。

答案 1 :(得分:1)

试试这个:

  

匹配(n)其中不是n.id =' id要删除'可选匹配(n) - [r] - (m)   在[' id中删除']而不是n.id中的n.id而不是[' id中删除']中的m.id   返回n,r,m