假设John正在向Met销售商品,Met正在向Bob和Alen销售商品, 而Alen再次向John出售货物。 我需要的是一个Cypher查询,返回所有闭合的圆圈,就像在这个例子中一样 John..Met..Alen,因为Alen再次向John出售商品,使其成为一个显示最低关系属性(金额)的闭合圈。我如何从整个数据库中执行此操作,获取所有已关闭的圈数和最小金额。谢谢!
答案 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(*)”会触发一个全局查询,该查询会根据图形的大小进行线性缩放。