【发布时间】:2017-05-13 01:03:18
【问题描述】:
我在 TinkerPop3 中有一个图,其中节点通过具有给定权重的边连接。
给定图中的节点 A,我试图遍历它以获取可以从 A 到达的所有节点,步骤少于 N,并按分数对它们进行排序。该分数是通过将路径中的每条边映射到该边的权重除以步数和总步数,最后对列表求和来计算的。
这是一个例子:
gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> a = g.addV('name','a').next()
==>v[0]
gremlin> b = g.addV('name','b').next()
==>v[2]
gremlin> c = g.addV('name','c').next()
==>v[4]
gremlin> d = g.addV('name','d').next()
==>v[6]
gremlin> e = g.addV('name','e').next()
==>v[8]
gremlin> a.addEdge('conn', b, 'weight', 1)
==>e[10][0-conn->2]
gremlin> a.addEdge('conn', c, 'weight', 3)
==>e[11][0-conn->4]
gremlin> b.addEdge('conn', d, 'weight', 3)
==>e[12][2-conn->6]
gremlin> d.addEdge('conn', e, 'weight', 9)
==>e[14][6-conn->8]
与“a”相关的节点的预期分数是:
score_n = sum_over_n(weight_n-1n / (depth_n * total_N_from_a_to_n))
score_b = w_ab / (1 * 1) = 1 / 1 = 1
score_c = w_ac / (1 * 1) = 3 / 1 = 3
score_d = (w_ab / (1 * 2)) + (w_bd / (2 * 2)) = 1/2 + 3/4 = 5/4
score_e = (w_ab / (1 * 3)) + (w_bd / (2 * 3)) + (w_de / (3 * 3)) = 1/3 + 3/6 + 9/9 = 11/6
因此,结果应该是相应的节点降序排列:
c e d b
我是 TinkerPop 和 Gremlin 的新手,我一直在尝试将重复步骤和 sack 步骤结合起来,但没有运气。到目前为止的计划是为每次遍历累积一个麻袋中的步骤,发出分数和节点,最后按分数排序,但我担心与该过程相关的潜在性能问题。
【问题讨论】:
-
你能添加你尝试但没有工作的查询吗?从现在开始可能比从头开始更容易。
-
此外,如果您能提供示例图表和预期结果,那将是有益的。
-
@DanielKuppitz 我添加了一个示例和预期结果:)
-
@AlaaMahmoud 我的查询还远远没有工作,所以不值得分享。即使我在描述中添加了一个示例。