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 个最相似的顶点及其各自的相似度得分的地图。