我有 2 个节点类型,可以说是“学生”和“教师”类型
Student have {id, name}.
Teacher have {id, name}.
学生可以与班级节点有可选的关系,如“TEACHES”。
(t:Teacher)-[r:TEACHES]->(c:Student).
[r:TEACHES] - Optional relationship. (present or may not present)
我想找到没有老师的“学生”节点。即没有任何传入关系“TEACHES”
请帮忙。
我认为您正在寻找这种模式。
MATCH (s:Student)
WHERE NOT (s)<-[:TEACHES]-(:Teacher)
RETURN s
这是一个简单的数据设置,以及解决问题所需的底部查询。本质上,您想要查询不存在关系的情况。这里的语法适用于 Neo4j 2.0,因此对于旧版本,答案会略有不同。
neo4j-sh (?)$ create (t:Teacher {name:"Bob"})-[r:TEACHES]->(s:Student {name:"Mary"});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 2
Relationships created: 1
Properties set: 2
Labels added: 2
19 ms
neo4j-sh (?)$ create (t:Teacher {name:"Mark"});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 1
Labels added: 1
5 ms
neo4j-sh (?)$ MATCH (s:Student) WHERE NOT (s)<-[:TEACHES]-(:Teacher) RETURN s
我由此得到了结果。首先匹配学生条件,然后发现关系为空
MATCH (s:Student)
OPTIONAL MATCH (t:Teacher)-[r:TEACHES]->(s)
WITH s,r
WHERE r IS NULL
RETURN s.name
如果您使用的是 Neo4j 5+ 版本
此查询将帮助您找到所有没有任何关系的节点。
match (n) where not (n)--() return n;
还有其他选择:
match(n)
optional match (n)-[r]-()
with id(n) as node, collect({id: id(r), type: type(r), startNode: id(startNode(r)), endNode: id(endNode(r))}) as rel
return {node: node, relationships: rel}
它将为您提供每个节点的列表,其中包括其关系。没有关系的节点将返回该节点的 null。