如何使用where子句在Neo4j中找到特定的子图

时间:2017-01-26 05:28:07

标签: neo4j cypher

我有一个大图,其中一些关系具有我想用来在创建子图时有效修剪图的属性。例如,如果我有一个名为'relevance score'的属性,我想从一个节点开始并扩散,收集所有节点和关系,但修剪关系具有上述属性的任何地方。

我这样做的尝试净化了这个问题:

start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r

我的尝试有两个我无法解决的问题:

1)反思我相信这不会导致修剪图形,而是一组不相交的图形。此外:

2)我从看起来正确形成的密码查询中得到以下错误:

Type mismatch: expected Any, Map, Node or Relationship but was Collection<Relationship> (line 1, column 52 (offset: 51))
"start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r"

2 个答案:

答案 0 :(得分:3)

您应该能够在关系集合上使用ALL()函数来强制执行该路径中的所有关系,该属性为null。

使用Gabor的示例图表,此查询应该有效。

MATCH p = (n {name: 'n1'})-[rs1*]->()
WHERE ALL(rel in rs1 WHERE rel.relevance_score is null)
RETURN p

答案 1 :(得分:2)

我能想到的一个解决方案是遍历所有关系(使用rs*),过滤掉没有relevance_score属性的关系,并查看rs“path”是否仍然相同。 (我引用“路径”,因为从技术上讲它不是Neo4j path)。

我创建了一个小示例图:

CREATE
  (n1:Node {name: 'n1'}),
  (n2:Node {name: 'n2'}),
  (n3:Node {name: 'n3'}),
  (n4:Node {name: 'n4'}),
  (n5:Node {name: 'n5'}),
  (n1)-[:REL {relevance_score: 0.5}]->(n2)-[:REL]->(n3),
  (n1)-[:REL]->(n4)-[:REL]->(n5)

图表包含节点n1n2之间的单个相关边。

enter image description here

查询(请注意我使用{name: 'n1'}获取起始节点,您可以使用START node=...):

MATCH (n {name: 'n1'})-[rs1*]->(x)
UNWIND rs1 AS r
WITH n, rs1, x, r
WHERE NOT exists(r.relevance_score)
WITH n, rs1, x, collect(r) AS rs2
WHERE rs1 = rs2
RETURN n, x

结果:

╒══════════╤══════════╕
│n         │x         │
╞══════════╪══════════╡
│{name: n1}│{name: n4}│
├──────────┼──────────┤
│{name: n1}│{name: n5}│
└──────────┴──────────┘

更新:请参阅InverseFalcon的答案以获得更简单的解决方案。