neo4j:受节点和 rel 属性约束的最短路径

neo4j: shortest paths constrained by node and rel properties

来自教程:

MATCH p=shortestPath( (keanu:Person)-[:KNOWS*]-(kevin:Person) ) 
WHERE keanu.name="Keanu Reeves" and kevin.name = "Kevin Bacon"
RETURN length(p)

假设每个 Person 节点都有年龄 属性 和职业。每个 KNOWS 边都有一个 length of acquaintance 属性。

什么 Cypher 查询会 return 最短路径,例如

age > 40 years
not (occupation = ACTOR)
lengthOfAcquaintance > 10 years

在分子生物学相互作用数据中,我们希望进行更复杂的查询 - 可能是 cypher 处理得很好的那种,但我不知道如何处理。例如:

找到受体分子A和转录因子B之间的最短路径,其中大部分边缘来自小规模实验,大多数基因被注释为激酶,边缘的证据(权重)为greater than 0.5

这些查询可能会出现在很多设置中。任何人都可以指出阅读材料和示例以帮助我理解这是如何完成的吗?并可能提供 "Bacon Number" 查询的适度扩展,以容纳一个节点和一条边 属性?

谢谢!

我认为您正在寻找的是 ALL predicate

这里有几个使用它的例子:

ShortestPath,其中路径中的所有参与者都应具有 age > 40 :

MATCH p=shortestPath( (keanu:Person)-[:KNOWS*]-(kevin:Person) ) 
WHERE keanu.name = "Keanu Reeves"
AND kevin.name = "Kevin Bacon" 
AND ALL(x IN nodes(p) WHERE x.age > 40)
RETURN p

最短路径,其中所有边都应具有 lengthOfAcquaintance > 10

MATCH p=shortestPath( (keanu:Person)-[:KNOWS*]-(kevin:Person) ) 
WHERE keanu.name = "Keanu Reeves" 
AND kevin.name = "Kevin Bacon"
AND ALL(x in rels(p) WHERE x.lengthOfAcquaintance > 100
RETURN p

当然你可以把两者结合起来:

MATCH p=shortestPath( (keanu:Person)-[:KNOWS*]-(kevin:Person) ) 
WHERE keanu.name = "Keanu Reeves" 
AND kevin.name = "Kevin Bacon"
AND ALL(x in rels(p) WHERE x.lengthOfAcquaintance > 10)
AND ALL(x in nodes(p) WHERE x.age > 40)
RETURN p