带有可选匹配的密码 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
不相关 - 跳至重要编辑。
我有以下查询:
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