如何在给定 gremlin 中的引用数组的情况下获取最相似顶点的列表
How to get a list of most similar vertexes given an array of references in gremlin
给出这样的图表:
其中A,B,C...比方说书,边表示两本书相似,相似程度用边上的数字表示。边缘的方向无关紧要。
给定 N 个引用,我想通过对连接的相似度数求和来检索最相似的直接连接的边,按最相似的第一个排序且不重复,不包括引用。
在上面的例子中,给定 A 和 B,我们会 return
F, 50
D, 45
E, 31
C, 30
G, 3
您能提供一些帮助吗?这是我认为它应该看起来的样子,但运气不好:
g.V('A','B').as('references').bothV().bothE().where(neq('references')).group('id').by('similarity',sum()).order().by('sum_similarity',desc)
这是执行此操作的查询:
g.V().has('name', within(['A','B'])).as('references')
.bothE().as('e').otherV()
.group().by('name').by(select('e').values('similarity').sum())
.unfold().order().by(values, desc)
解释:
第一行通过'name'使用within
选择参考顶点。
第二条线遍历到最近的邻居,同时保持边的参考。
第三行按'name'作为键,引用边的总和'similarity'作为值对顶点进行分组。
最后一行使用 unfold
分解地图并按值降序排列。
Kfir's 可能会起作用,但它没有考虑缺少的 similarity
属性(这似乎是可能的,考虑到 'A' 和 'B' 之间的边缘)。此外,您不需要使用任何启用路径跟踪的步骤。
让我们从您的图表开始:
g = TinkerGraph.open().traversal()
g.addV().property(id, 'A').as('A').
addV().property(id, 'B').as('B').
addV().property(id, 'C').as('C').
addV().property(id, 'D').as('D').
addV().property(id, 'E').as('E').
addV().property(id, 'F').as('F').
addV().property(id, 'G').as('G').
addV().property(id, 'H').as('H').
addV().property(id, 'J').as('J').
addE('similarTo').from('A').to('C').property('similarity', 30).
addE('similarTo').from('D').to('A').property('similarity', 20).
addE('similarTo').from('E').to('A').property('similarity', 10).
addE('similarTo').from('B').to('A').
addE('similarTo').from('B').to('D').property('similarity', 25).
addE('similarTo').from('B').to('E').property('similarity', 21).
addE('similarTo').from('F').to('B').property('similarity', 50).
addE('similarTo').from('G').to('B').property('similarity', 3).
addE('similarTo').from('F').to('H').property('similarity', 80).
addE('similarTo').from('H').to('J').property('similarity', 5).
addE('similarTo').from('J').to('F').property('similarity', 11).iterate()
现在,考虑缺失属性并仅使用不需要路径跟踪的步骤的查询将是:
gremlin> g.V('A','B','C').
union(outE('similarTo').sack(assign).
by(coalesce(values('similarity'),
constant(0))).inV(),
inE('similarTo').sack(assign).
by(coalesce(values('similarity'),
constant(0))).outV()).
hasId(without('A','B', 'C')).
group().
by().
by(sack().sum()).
order(local).
by(values, desc).
limit(local, 3).next()
==>v[F]=50
==>v[D]=45
==>v[E]=31
结果是包含 3 个最相似的顶点及其各自的相似度得分的地图。
给出这样的图表:
其中A,B,C...比方说书,边表示两本书相似,相似程度用边上的数字表示。边缘的方向无关紧要。
给定 N 个引用,我想通过对连接的相似度数求和来检索最相似的直接连接的边,按最相似的第一个排序且不重复,不包括引用。
在上面的例子中,给定 A 和 B,我们会 return
F, 50
D, 45
E, 31
C, 30
G, 3
您能提供一些帮助吗?这是我认为它应该看起来的样子,但运气不好:
g.V('A','B').as('references').bothV().bothE().where(neq('references')).group('id').by('similarity',sum()).order().by('sum_similarity',desc)
这是执行此操作的查询:
g.V().has('name', within(['A','B'])).as('references')
.bothE().as('e').otherV()
.group().by('name').by(select('e').values('similarity').sum())
.unfold().order().by(values, desc)
解释:
第一行通过'name'使用within
选择参考顶点。
第二条线遍历到最近的邻居,同时保持边的参考。
第三行按'name'作为键,引用边的总和'similarity'作为值对顶点进行分组。
最后一行使用 unfold
分解地图并按值降序排列。
Kfir's 可能会起作用,但它没有考虑缺少的 similarity
属性(这似乎是可能的,考虑到 'A' 和 'B' 之间的边缘)。此外,您不需要使用任何启用路径跟踪的步骤。
让我们从您的图表开始:
g = TinkerGraph.open().traversal()
g.addV().property(id, 'A').as('A').
addV().property(id, 'B').as('B').
addV().property(id, 'C').as('C').
addV().property(id, 'D').as('D').
addV().property(id, 'E').as('E').
addV().property(id, 'F').as('F').
addV().property(id, 'G').as('G').
addV().property(id, 'H').as('H').
addV().property(id, 'J').as('J').
addE('similarTo').from('A').to('C').property('similarity', 30).
addE('similarTo').from('D').to('A').property('similarity', 20).
addE('similarTo').from('E').to('A').property('similarity', 10).
addE('similarTo').from('B').to('A').
addE('similarTo').from('B').to('D').property('similarity', 25).
addE('similarTo').from('B').to('E').property('similarity', 21).
addE('similarTo').from('F').to('B').property('similarity', 50).
addE('similarTo').from('G').to('B').property('similarity', 3).
addE('similarTo').from('F').to('H').property('similarity', 80).
addE('similarTo').from('H').to('J').property('similarity', 5).
addE('similarTo').from('J').to('F').property('similarity', 11).iterate()
现在,考虑缺失属性并仅使用不需要路径跟踪的步骤的查询将是:
gremlin> g.V('A','B','C').
union(outE('similarTo').sack(assign).
by(coalesce(values('similarity'),
constant(0))).inV(),
inE('similarTo').sack(assign).
by(coalesce(values('similarity'),
constant(0))).outV()).
hasId(without('A','B', 'C')).
group().
by().
by(sack().sum()).
order(local).
by(values, desc).
limit(local, 3).next()
==>v[F]=50
==>v[D]=45
==>v[E]=31
结果是包含 3 个最相似的顶点及其各自的相似度得分的地图。