Neo4j';s Cypher查询语言-减少匹配中的节点
Neo4j相对较新。我意识到我最初发布这篇文章的方式太模棱两可了。下面希望是一个更好的解释Neo4j';s Cypher查询语言-减少匹配中的节点,neo4j,cypher,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) //Subgra
//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)
我想写的是一个用于检测以下内容的查询:
-有两个或两个以上彼此不认识的人居住在那里的所有地址(和人员)
这意味着只能找到子图1
无法找到子图2,因为有两个人居住在那里,但他们彼此认识
无法找到子图3,因为只有1人居住在那里
再次感谢您的帮助。这个密码查询应该可以:
MATCH (n1)-[:RESIDES_AT]->()<-[:RESIDES_AT]-(n2)
WHERE NOT exists((n1)-[:KNOWS]-(n2))
RETURN n1, n2
MATCH(n1)-[:RESIDES_AT]->()此密码查询应该可以工作:
MATCH (n1)-[:RESIDES_AT]->()<-[:RESIDES_AT]-(n2)
WHERE NOT exists((n1)-[:KNOWS]-(n2))
RETURN n1, n2
MATCH(n1)-[:RESIDES_AT]->()回答得很好,不过使用和id(n1)
可能会很有用,以防止在顺序翻转时匹配到相同的节点。或者确实将节点匹配到自身,因此也可能需要和n1 n2
。有趣的是,我不知道您可以将模式放入notexists(),这意味着你也可以做相反的事情。答案很好,尽管使用和id(n1)
可能会很有用,以防止在顺序翻转时匹配到相同的节点。或者确实要将节点匹配到自身,所以也可能需要和n1 n2
。有趣的是,我不知道你可以在notexists()中放置模式,这意味着你也可以做相反的事情。你真的应该使用标签。因为这里没有标签,所以我们可以提供的任何查询解决方案(没有对标签进行假设)都必须检查所有可能节点上的模式,这是无效的。例如,使用:Home节点将确保使用标签索引从:Home节点开始查询,并减少执行时间。我更改了示例您确实应该使用标签。因为这里没有标签,所以我们可以提供的任何查询解决方案(没有对标签进行假设)都必须检查所有可能节点上的模式,这是无效的。例如,使用:Home节点将确保使用标签索引从:Home节点开始查询,并减少执行时间