Neo4j的Cypher查询语言 - 减少匹配中的节点

时间:2017-08-24 21:00:13

标签: neo4j cypher

Neo4j相对较新。我意识到我最初发布它的方式太模糊了。以下是希望更好的解释。

//Subgraph 1
Create (p1:Person {name: 'Person1'}) 
Create (p2:Person {name: 'Person2'})
Create (a1:Address {street: 'Suspicious'})
Create (p1)-[:Resides]->(a1)
Create (p2)-[:Resides]->(a1)

//Subgraph 2
Create (p3:Person {name: 'Person3'})
Create (p4:Person {name: 'Person4'})
Create (a2:Address {street: 'Double'})
Create (p3)-[:Resides]->(a2)
Create (p4)-[:Resides]->(a2)
Create (p3)-[:Knows]->(p4)

//Subgraph 3
Create (p5:Person {name: 'Person5'})
Create (a3:Address {street: 'Single'})
Create (p5)-[:Resides]->(a3)

我想写的是一个检测以下内容的查询: - 所有拥有2个或更多人的地址(和人)彼此不认识。

这意味着只能找到Subgraph1。

找不到子图2,因为有两个人住在那里,但他们互相认识。

找不到子图3,因为那里只有一个人。

再次感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

此Cypher查询应该有效:

MATCH (n1)-[:RESIDES_AT]->()<-[:RESIDES_AT]-(n2)
WHERE NOT exists((n1)-[:KNOWS]-(n2))
RETURN n1, n2

首先匹配与同一节点有RESIDES_AT关系的节点,然后过滤掉KNOWS关系的节点。