带有可选匹配的密码 NOT IN 查询

cypher NOT IN query with Optional Match

不相关 - 跳至重要编辑。

我有以下查询:

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

此查询returns与特定人有关系的所有人、狗和猫。我想将其转过来以接收此查询结果中不包含的所有节点和关系。

如果是 SQL 就是

select * from graph where id NOT IN (my_query)

我认为可选匹配是有问题的部分。我该怎么做? 有什么建议吗?

谢谢。

--重要编辑--

大家好,很抱歉更改了我的问题,但我的要求已更改。我需要通过 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

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

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

您必须切换查询的 'perspective'...首先遍历每个节点,然后修剪与您的人相关的节点。

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 而不是图表。每当您必须遍历带有标签的每个节点时,您都​​处于关系区域,图表的效率会降低。

试试这个:

match (n) where not n.id = 'id to remove' optional match (n)-[r]-(m) where not n.id in ['id to remove'] and not m.id in ['id to remove'] return n,r,m