首页 文章

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

提问于
浏览
1

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

到目前为止我有:

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

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

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

这使我按源顶点计数,但包括具有该标签的所有边,而不管它们具有哪些属性值 .

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

提前致谢 .

1 回答

  • 3

    使用来自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]
    

相关问题