【问题标题】:Neo4j's Cypher query language - reducing nodes in a matchNeo4j 的 Cypher 查询语言 - 减少匹配中的节点
【发布时间】:2017-08-24 21:00:12
【问题描述】:

对于 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。

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

找不到 Subgraph3,因为那里只有 1 个人。

再次感谢您的帮助。

【问题讨论】:

  • 你真的应该使用标签。由于您在这里没有标签,因此我们可以提供的任何查询解决方案(不对标签做出假设)都必须检查所有可能节点上的模式,这效率不高。例如,使用 :Home 节点将确保查询将使用标签索引从 :Home 节点开始,并将减少执行时间。
  • 我已经更改了示例

标签: neo4j cypher


【解决方案1】:

这个 Cypher 查询应该可以工作:

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

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

【讨论】:

  • 很好的答案,尽管使用AND id(n1) &lt; id(n2) 来防止匹配到相同的节点并翻转顺序可能很有用。
  • 或者确实匹配一个节点到自身,所以AND n1 &lt;&gt; n2可能也需要。
  • 有趣,我不知道你可以把模式放在 NOT exists() 中,这意味着你也可以做相反的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
相关资源
最近更新 更多