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

Gremlin:检索包含匹配边的路径,gremlin,tinkerpop,Gremlin,Tinkerpop,我正在学习Gremlin Tinkerpop,并尝试通过使用匹配子句进行查询来检索路径 图表示例: A : LabelA ----edge["rel1"]-- B1 : LabelB { prop1 : "val1" } |--edge["rel2"]-- B2 : LabelB { prop1 : "val1" } |--edge["rel3"]-

我正在学习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()
如何检索包含匹配边的路径?(没有“as”)


谢谢。

一般来说,我不会对这种类型的查询使用
匹配
步骤,但这里有一些示例。如果希望边显示在
路径中
只需使用
as
步骤为其添加标签即可。我使用AirRoutes数据集生成这些示例

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],v[1],e[5120][1-route->135],v[135],[b:v[135],lba:v[1]]]    
但是,在这种情况下,
匹配
步骤是多余的,实际上在
路径
中产生的结果比您可能想要的要多。更好的小精灵方法是:

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

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

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

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
情况,有许多条件,
路径将很长,并且充满了您可能不感兴趣的内容。

当您说无法检索边缘时,您的意思是让它出现在
路径
结果中吗?如果是这样,那么在我用TinkerGraph进行的快速测试中,我确实看到了结果中的边缘。您正在使用哪个图形数据库?通常,如果我想要返回的是路径,我倾向于避免使用
match
,因为使用
match
路径将包含步骤执行的完整计算,这通常不是我想要/需要的。确切地说,路径结果与match匹配@凯尔文谢谢你!我在比赛中加入了。作为整体关系。
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]    
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]