获取闭环内的所有节点和关系属性

时间:2013-03-30 19:12:49

标签: neo4j cypher gremlin

假设John正在向Met销售商品,Met正在向Bob和Alen销售商品, 而Alen再次向John出售货物。 我需要的是一个Cypher查询,返回所有闭合的圆圈,就像在这个例子中一样 John..Met..Alen,因为Alen再次向John出售商品,使其成为一个显示最低关系属性(金额)的闭合圈。我如何从整个数据库中执行此操作,获取所有已关闭的圈数和最小金额。谢谢!

2 个答案:

答案 0 :(得分:3)

从Stefans回答开始,至少要考虑路径的长度。

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return p, lenght(p)

仅为每个节点的最短路径长度

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return n, min(lenght(p))

如果你想获得最短的路径:

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
with n, collect(nodes(p)) as nodes, min(length(nodes(p))) as l
return n, head(filter(p in nodes : length(p) = l)) as shortest_circle,l

请参阅Neo4j控制台以获取示例:http://console.neo4j.org/r/wrm522

你会注意到的是,如果你扫描整个图形,你将为圆圈的每个节点多次获得相同的圆圈。

这使用节点,长度,收集,头部和过滤器功能以及最小聚合。 见:http://docs.neo4j.org/chunked/milestone/query-function.html

正如Stefan所说,扫描所有节点可能非常昂贵。

答案 1 :(得分:0)

您可以执行以下查询:

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return p

其中5是循环的最大深度。

请参阅Neo4j console中的示例。但是,使用“node(*)”会触发一个全局查询,该查询会根据图形的大小进行线性缩放。