遍历节点之间的最佳路径

时间:2016-02-27 09:52:16

标签: node.js neo4j cypher

在图中有多条路径从点(:A)到(:B)到节点(:C),我想通过节点从(:A)到(:B)提取路径类型(c:C),其中c.Value最大。例如,只与最老的共同演员连接所有电影。

match p=(m1:Movie) <-[:ACTED_IN]- (a:Actor) -[:ACTED_IN]-> (m2:Movie) 
return m1.Name, m2.Name, a.Name, max(a.Age) 

上述查询返回最老的actor的正确年龄,但并不总是正确的名称。

相反,我注意到以下查询返回正确的年龄和名称。

match p=(m1:Movie) <-[:ACTED_IN]- (a:Actor) -[:ACTED_IN]-> (m2:Movie) 
with m1, m2, a order by a.age desc
return m1.name, m2.name, a.name, max(a.age), head(collect(a.name))

这总是如此吗?大概吧。 我有更好的方法来完成这项工作而不进行分类可能会花费多少?

2 个答案:

答案 0 :(得分:0)

您需要使用ORDER BY ... LIMIT 1

match p=(m1:Movie) <-[:ACTED_IN]- (a:Actor) -[:ACTED_IN]-> (m2:Movie) 
return m1.Name, m2.Name, a.Name, a.Age order by a.Age desc limit 1

请注意,您基本上想要做一个加权最短路径。 Neo4j可以使用java代码和GraphAlgoFactory更有效地完成此操作,请参阅参考手册中的相关章节。

答案 1 :(得分:0)

对于那些愿意做类似事情的人,请考虑阅读this post中的@_nicolemargaret来描述如何提取成对电影中的n个最老的演员而不仅仅是第一个,如同头部(收集())。

相关问题