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

时间:2018-04-21 01:05:53

标签: gremlin tinkerpop3

我有一个图表,其中顶点有几个出站边类型,每个边类型都有属性。我想得到每个顶点的出站边数,但是将计数限制为具有特定标签和属性值的边。

到目前为止,我有:

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()步骤,但我不确定如何形成它。

提前致谢。

1 个答案:

答案 0 :(得分:3)

使用"现代"来自TinkerPop的玩具图,我认为你可以使用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]