2017-08-24 66 views
0

Neo4j相对较新。我意识到我原来发布的这个模式太模糊了。以下是希望更好的解释。Neo4j的Cypher查询语言 - 减少匹配节点

//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。

Subgraph2不会被找到,因为有2个人居住在那里,但他们彼此认识。

子图3将不会被找到,因为只有1人居住在那里。

再次感谢您的帮助。

+1

你真的应该使用标签。由于您在这里没有标签,因此我们可以提供的任何查询解决方案(不对标签进行假设)将不得不检查所有可能节点上的模式,这是无效的。例如,使用:Home节点将确保查询将从:Home节点开始使用标签索引,并将减少执行时间。 – InverseFalcon

+0

我改变了示例 – Hutch

回答

2

这暗号查询应该工作:

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

开始通过对具有RESIDES_AT关系到同一个节点的节点匹配,然后筛选出有KNOWS关系的节点。

+1

很好的答案,尽管让'ANDID(n1) InverseFalcon

+0

或者确实将一个节点与自身进行匹配,所以也可能需要'AND n1 <> n2'。 –

+0

有趣的是,我不知道你可以把模式放在NOT exists()中,这意味着你也可以做相反的事情。 – agm1984

相关问题