我正在尝试计算图形中的对象数量。但是,顶点必须属于一组特定的键,因此我执行以下操作:
对于顶点,我使用:
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]