Tinkerprop Gremlin:按关系权重排序
Tinkerprop Gremlin: Order by the weight of relations
这是我的测试数据库:
graph = TinkerGraph.open()
g = graph.traversal()
v1 = g.addV("person").property(id, 1).property("name", "1").next()
v2 = g.addV("person").property(id, 2).property("name", "2").next()
v3 = g.addV("person").property(id, 3).property("name", "3").next()
v4 = g.addV("person").property(id, 4).property("name", "4").next()
v5 = g.addV("person").property(id, 5).property("name", "5").next()
v6 = g.addV("person").property(id, 6).property("name", "6").next()
g.addE("knows").from(v1).to(v2).property(id, 10).property("weight", 0.4)
g.addE("knows").from(v1).to(v2).property(id, 11).property("weight", 0.4)
g.addE("knows").from(v1).to(v4).property(id, 12).property("weight", 0.2)
g.addE("knows").from(v1).to(v6).property(id, 13).property("weight", 1)
g.addE("knows").from(v2).to(v3).property(id, 14).property("weight", 0.4)
g.addE("knows").from(v3).to(v5).property(id, 15).property("weight", 0.4)
g.addE("knows").from(v4).to(v5).property(id, 16).property("weight", 0.4)
g.addE("knows").from(v4).to(v5).property(id, 17).property("weight", 0.3)
g.addE("knows").from(v6).to(v5).property(id, 18).property("weight", 0.4)
g.addE("knows").from(v6).to(v5).property(id, 19).property("weight", 0.4)
g.addE("knows").from(v6).to(v5).property(id, 20).property("weight", 0.2)
我正在尝试获得从一个人到另一个人的更短路径(最小重量总和)。
这是我当前的查询:
g.V(1).repeat(bothE("knows").bothV()).until(hasId(6)).path().as("path").map(unfold().coalesce(values("weight"), constant(0)).sum()).as("Cost").select("path", "Cost").limit(10);
==>[path:[v[1],e[13][1-knows->6],v[6]],Cost:1]
==>[path:[v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.4]
==>[path:[v[1],e[11][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.4]
==>[path:[v[1],e[12][1-knows->4],v[1],e[13][1-knows->6],v[6]],Cost:1.2]
==>[path:[v[1],e[13][1-knows->6],v[1],e[13][1-knows->6],v[6]],Cost:2]
==>[path:[v[1],e[10][1-knows->2],v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
==>[path:[v[1],e[10][1-knows->2],v[1],e[11][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
==>[path:[v[1],e[10][1-knows->2],v[1],e[12][1-knows->4],v[1],e[13][1-knows->6],v[6]],Cost:1.6]
==>[path:[v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[1],e[13][1-knows->6],v[6]],Cost:2.4]
==>[path:[v[1],e[10][1-knows->2],v[2],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
我找不到如何按成本订购。我正在尝试 order()
和 by("Cost")
这一步,但它没有用,它从来没有 return 结果。这是我的一项测试 return 什么都没有。
g.V(1).repeat(bothE("knows").bothV()).until(hasId(6)).path().as("path").map(unfold().coalesce(values("weight"), constant(0)).sum()).as("Cost").select("path").order().by(select("Cost")).limit(10);
您的查询 运行 进入了无限循环。在您的第一个查询中,您很幸运,因为 repeat()
知道 limit()
步骤,因此在发出 10 个顶点后停止。包含 order().by()
后,repeat()
无法再执行此操作,因为 order().by()
需要所有结果才能订购任何东西。
此外,还有一种更好的方式来跟踪成本:
g.withSack(0).V(1).
repeat(bothE("knows").sack(sum).by("weight").otherV().simplePath()).
until(hasId(6)).
order().
by(sack()).
limit(10).
path()
这是我的测试数据库:
graph = TinkerGraph.open()
g = graph.traversal()
v1 = g.addV("person").property(id, 1).property("name", "1").next()
v2 = g.addV("person").property(id, 2).property("name", "2").next()
v3 = g.addV("person").property(id, 3).property("name", "3").next()
v4 = g.addV("person").property(id, 4).property("name", "4").next()
v5 = g.addV("person").property(id, 5).property("name", "5").next()
v6 = g.addV("person").property(id, 6).property("name", "6").next()
g.addE("knows").from(v1).to(v2).property(id, 10).property("weight", 0.4)
g.addE("knows").from(v1).to(v2).property(id, 11).property("weight", 0.4)
g.addE("knows").from(v1).to(v4).property(id, 12).property("weight", 0.2)
g.addE("knows").from(v1).to(v6).property(id, 13).property("weight", 1)
g.addE("knows").from(v2).to(v3).property(id, 14).property("weight", 0.4)
g.addE("knows").from(v3).to(v5).property(id, 15).property("weight", 0.4)
g.addE("knows").from(v4).to(v5).property(id, 16).property("weight", 0.4)
g.addE("knows").from(v4).to(v5).property(id, 17).property("weight", 0.3)
g.addE("knows").from(v6).to(v5).property(id, 18).property("weight", 0.4)
g.addE("knows").from(v6).to(v5).property(id, 19).property("weight", 0.4)
g.addE("knows").from(v6).to(v5).property(id, 20).property("weight", 0.2)
我正在尝试获得从一个人到另一个人的更短路径(最小重量总和)。
这是我当前的查询:
g.V(1).repeat(bothE("knows").bothV()).until(hasId(6)).path().as("path").map(unfold().coalesce(values("weight"), constant(0)).sum()).as("Cost").select("path", "Cost").limit(10);
==>[path:[v[1],e[13][1-knows->6],v[6]],Cost:1]
==>[path:[v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.4]
==>[path:[v[1],e[11][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.4]
==>[path:[v[1],e[12][1-knows->4],v[1],e[13][1-knows->6],v[6]],Cost:1.2]
==>[path:[v[1],e[13][1-knows->6],v[1],e[13][1-knows->6],v[6]],Cost:2]
==>[path:[v[1],e[10][1-knows->2],v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
==>[path:[v[1],e[10][1-knows->2],v[1],e[11][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
==>[path:[v[1],e[10][1-knows->2],v[1],e[12][1-knows->4],v[1],e[13][1-knows->6],v[6]],Cost:1.6]
==>[path:[v[1],e[10][1-knows->2],v[1],e[13][1-knows->6],v[1],e[13][1-knows->6],v[6]],Cost:2.4]
==>[path:[v[1],e[10][1-knows->2],v[2],e[10][1-knows->2],v[1],e[13][1-knows->6],v[6]],Cost:1.8]
我找不到如何按成本订购。我正在尝试 order()
和 by("Cost")
这一步,但它没有用,它从来没有 return 结果。这是我的一项测试 return 什么都没有。
g.V(1).repeat(bothE("knows").bothV()).until(hasId(6)).path().as("path").map(unfold().coalesce(values("weight"), constant(0)).sum()).as("Cost").select("path").order().by(select("Cost")).limit(10);
您的查询 运行 进入了无限循环。在您的第一个查询中,您很幸运,因为 repeat()
知道 limit()
步骤,因此在发出 10 个顶点后停止。包含 order().by()
后,repeat()
无法再执行此操作,因为 order().by()
需要所有结果才能订购任何东西。
此外,还有一种更好的方式来跟踪成本:
g.withSack(0).V(1).
repeat(bothE("knows").sack(sum).by("weight").otherV().simplePath()).
until(hasId(6)).
order().
by(sack()).
limit(10).
path()