Gremlin:计算具有给定标签和 属性 值的出站边缘

Gremlin: Count outbound edges with a given label and property value

我有一个图,其中顶点有多个出站边类型,并且每个边类型都有属性。我想从每个顶点获取出站边缘的计数,但将计数限制为具有特定标签和 属性 值的边缘。

到目前为止我有:

g.V().hasLabel("vertexLabel").as("source")
    .outE("edgeLabel").has("edgeProp", "propValue").as("edge")
    .select("source", "edge")

这给了我一个列表,其中包含每个源顶点和每个带有正确标签和 属性 的出边。我想要做的是将每个源顶点和出站边数的计数减少到一个条目。但是我似乎无法让 groupCountoutE 结合使用。我得到的最接近的是:

g.V().hasLabel("vertexLabel").as("source").out("edgeLabel").groupCount()

这让我按源顶点计数,但包括所有带有该标签的边,无论它们具有什么 属性 值。

我知道这可能需要一个 group().by() 步骤,但我不确定如何形成它。

提前致谢。

使用 TinkerPop 的 "modern" 玩具图,我认为您可以使用 project():

来最好地表达这一点
gremlin> g.V().hasLabel('person').
......1>   project('source','count').
......2>     by().
......3>     by(outE('created').has('weight',gt(0.5)).count())
==>[source:v[1],count:0]
==>[source:v[2],count:0]
==>[source:v[4],count:1]
==>[source:v[6],count:0]

你也可以用 groupCount() 来做,但我觉得有点尴尬:

gremlin> g.V().hasLabel('person').
......1>   outE('created').
......2>   has('weight',gt(0.5)).
......3>   groupCount().
......4>     by(inV())
==>[v[5]:1]

请注意,在这种情况下,您丢失了“0”值,因为边缘在 groupCount() 之前被过滤掉了。您也可以使用 group(),但我认为它读起来不如 project():

gremlin> g.V().hasLabel('person').
......1>   group().
......2>     by().
......3>     by(outE('created').
......4>        has('weight',gt(0.5)).count())
==>[v[1]:0,v[2]:0,v[4]:1,v[6]:0]