格雷姆林是否都重复计算边缘



我正在尝试计算图形中的对象数量。但是,顶点必须属于一组特定的键,因此我执行以下操作:

对于顶点,我使用:
g.V().has('document_id', P.within(list_o_keys)).count().next()

对于边缘,我使用:
g.V().has('document_id', P.within(list_o_keys)).bothE().count().next()

由于这些顶点之间存在关系,这是否会导致重复计算边
例如,对于关系 A->B,它将计为 2 条边,因为bothE()会将边从 A 返回,边返回到 B 中?

好吧,我不会称之为边缘的重复计数。它计算传入的边,然后计算传出的边:

gremlin> g.addV('a').as('a').
......1>   addV('b').as('b').
......2>   addE('link').from('a').to('b').
......3>   addE('link').from('b').to('a').iterate()
gremlin> g.V().hasLabel('a').bothE().count()
==>2

请注意,它不计算从 A 到进入 B 的边缘。它从 A 到到 A 的边缘计数。如果你想要一个或另一个,那么你会根据你需要使用outE()inE()

在这种情况下,它将对它们进行两次计数,如以下示例所示:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1,4).count()
==>2
gremlin> g.V(1,4).bothE().count()
==>6
gremlin> g.V(1,4).bothE().dedup().count()
==>5

dedup()是防止这种情况的最简单方法。另外,请注意,您可以组合这两个遍历:

gremlin> g.V(1,4).fold().
           project('a','b').
             by(count(local)).
             by(unfold().bothE().dedup().count())
==>[a:2,b:5]

最新更新