Gremlin bothE()是否将边数加倍?

时间:2019-02-08 10:08:21

标签: gremlin

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

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

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

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

2 个答案:

答案 0 :(得分:0)

好吧,我不会称其为边缘重复计算。它先计算输入边,然后计算输出边:

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(),具体取决于根据您的需要。

答案 1 :(得分:0)

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

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]