Neo4j 密码不在查询中,具有可选匹配项
不相关-跳到重要编辑。 我有以下疑问:Neo4j 密码不在查询中,具有可选匹配项,neo4j,cypher,graph-databases,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 此查询返回与特定人有关系的所有人、狗和猫。我想将其转换为接收此查询结果中未包含的所有节点
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,那么它就是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
但是这个函数不会返回关系(记住,我还需要断开连接的节点)
如何获取排除特定节点的整个图形?这包括节点和关系、连接的节点和断开连接的节点。您必须切换查询的“透视图”。。。首先在每个节点上循环,然后修剪与您的人连接的节点
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 (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而不是图形的问题。每当您必须使用标签循环每个节点时,您处于关系区域,图形的效率就会降低。尝试以下方法:
匹配(n),其中非n.id='id to remove'可选匹配(n)-[r]-(m)
其中,['id to remove']中不是n.id,而['id to remove']中不是m.id
返回n,r,m
试试这个:
匹配(n),其中非n.id='id to remove'可选匹配(n)-[r]-(m)
其中,['id to remove']中不是n.id,而['id to remove']中不是m.id
返回n,r,m
感谢您的快速回答,但是不需要的节点仍然会返回,我稍微编辑了一下以保持整洁,但是您指的是哪些不需要的节点?它返回什么不应该返回?它本身返回“坏”节点请参见上面的更新。将
*0..1
添加到关系中以排除坏节点。感谢您的快速回答,但是不需要的节点仍然会返回,我稍微编辑了一下以保持整洁,但是您指的是哪些不需要的节点?它返回什么不应该返回?它本身返回“坏”节点请参见上面的更新。将*0..1
添加到关系中以排除坏节点。为了澄清,您正在查找与您的:person连接的所有节点,这些节点不是:persons/:dogs/:cats连接的:friend/:connected/:owner关系?或者,您是否正在尝试查找所有与这些节点不存在这些关系的人?或者,您是否正在尝试查找整个图形中不包含查询中的任何:person节点(和连接的节点)的所有节点?所需输出的示例是什么?根据您的SQL语句和问题描述,我推断您希望找到所有未连接到具有特定id的人员的人员
、狗
、猫
?请阅读我的上一次编辑。很遗憾,我的要求已更改。为了澄清,您正在查找连接到您的:person的所有节点,这些节点不是:persons/:dogs/:cats通过:friend/:connected/:owner关系连接的?或者,您是否正在尝试查找所有与这些节点不存在这些关系的人?或者,您是否正在尝试查找整个图形中不包含查询中的任何:person节点(和连接的节点)的所有节点?所需输出的示例是什么?根据您的SQL语句和问题描述,我推断您希望找到所有未连接到具有特定id的人员的人员
、狗
、猫
?请阅读我的上一次编辑。不幸的是,我的要求已经改变了。