1

给定这样的图表:

在此处输入图像描述


其中 A,B,C... 比方说书籍,边表示两本书相似,相似程度用边中的数字表示。边缘的方向无关紧要。

给定 N 个引用,我想通过求和连接的相似性数来检索最相似的直接连接边,按最相似的第一个排序且不重复,不包括引用。

在上面的例子中,给定 A 和 B,我们将返回

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)
4

2 回答 2

1

这是执行此操作的查询:

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

第二行遍历到最近的邻居,同时保持对边缘的引用。

第三行按“名称”作为键对顶点进行分组,将参考边的总和“相似性”作为值。

最后一行使用反汇编地图unfold并按值降序排列。

于 2019-09-01T19:46:04.453 回答
0

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

于 2019-09-01T20:55:44.207 回答