我有一个大图,其中一些关系具有我想用来在创建子图时有效修剪图的属性。例如,如果我有一个名为'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"
答案 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)
图表包含节点n1
和n2
之间的单个相关边。
查询(请注意我使用{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的答案以获得更简单的解决方案。