Gremlin:检索包含匹配边缘的路径

问题描述

我正在学习Gremlin-Tinkerpop,并尝试进行查询以使用匹配子句检索带有查询的路径。

图样本:

A : LabelA ----edge["rel1"]-- B1 : LabelB { prop1 : "val1" }
            |--edge["rel2"]-- B2 : LabelB { prop1 : "val1" }
            |--edge["rel3"]-- B3 : LabelB { prop1 : "val1" }
            |--edge["rel4"]-- B4 : LabelB { prop1 : "val2" }
            |--edge["rel5"]-- B5 : LabelB { prop1 : "val2" }
 

很容易检索包括边的路径。像这样

g.V().hasLabel("LabelA").outE().inV().hasLabel("LabelB").path()

但是..通过MATCH,我无法获取'edge'

g.V().match(__.as("lba").hasLabel("LabelA").outE().inV().hasLabel("LabelB").as("b")).path()

如何使用MATCH检索包括边的路径? (没有“ as”)

g.V().match(__.as("lba").hasLabel("LabelA").outE().as("r1").inV().hasLabel("LabelB").as("b")).path()

谢谢。

解决方法

通常,对于这种类型的查询,我不会使用match步骤,但这是一些示例。如果您希望边缘出现在path中,只需使用as步骤为其添加标签。我使用空中航线数据集生成了这些示例。

gremlin> g.V().match(__.as("lba").hasLabel("airport").outE().inV().hasLabel("airport").as("b")).path().limit(1)
==>[v[1],v[1],v[135],[b:v[135],lba:v[1]]]

gremlin> g.V().match(__.as("lba").hasLabel("airport").outE().as('e').inV().hasLabel("airport").as("b")).path().limit(
1)
==>[v[1],e[5120][1-route->135],lba:v[1]]]    

但是,在这种情况下,match步骤是多余的,实际上在path中产生的收益比您可能想要的要多。更好的Gremlin方法是:

gremlin> g.V().hasLabel("airport").outE().inV().hasLabel("airport").path().limit(1)
==>[v[1],v[135]] 

  

在这种情况下(以下),匹配可能很方便,但是即使如此,您也可以仅使用where步骤来表达这一点(这将查找没有返回起始机场的返回路线的路线)。

gremlin> g.V().hasLabel('airport').
......1>       match(__.as('a').out().as('b'),......2>             __.not(__.as('b').out().as('a'))).
......3>       select('a','b').
......4>         by('code').
......5>       limit(1)
  
==>[a:JFK,b:LCY]    

这也可以在不使用match步骤的情况下完成

gremlin> g.V().hasLabel('airport').as('a').
......1>       out().as('b').
......2>       where(__.not(out().as('a'))).
......3>       select('a','b').
......4>         by('code').
......5>         limit(1)    

==>[a:JFK,b:LCY]  

通常,在复杂的match情况下,使用select时使用path可能比使用match更有用。在许多情况下,path会很长而且充满了您可能不感兴趣的内容。