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

时间:2016-02-17 03:46:52

标签: neo4j cypher shortest-path

从教程:

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

想象一下,每个Person节点都有一个age属性和一个职业。每个KNOWS边缘都有length of acquaintance属性。

Cypher查询将返回最短路径,例如

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

在分子生物学相互作用数据中,我们希望制作更复杂的查询 - 可能是cypher处理得很好的那种,但是我怎么会这样。例如:

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

这些查询可能会出现在很多设置中。任何人都可以指出我的阅读和例子,这将有助于我理解这是如何做到的?并且可能提供&#34;培根数量的适度扩展&#34;容纳一个节点和一个边缘属性的查询?

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您所寻找的是ALL predicate

以下是使用它的几个例子:

ShortestPath,路径中的所有actor都应该有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

ShortestPath,其中所有边都应该有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