【问题标题】:Gremlin: Retrieve Path which includes edges with matchGremlin:检索包含匹配边缘的路径
【发布时间】:2020-10-24 04:09:32
【问题描述】:

我正在学习 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,我无法检索“边缘”

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()

谢谢。

【问题讨论】:

  • 当您说您无法检索边缘时-您的意思是它出现在path 结果中吗?如果是这样,那么在我对 TinkerGraph 的快速测试中,我确实看到了结果中的边缘。您正在使用哪个图形数据库?一般来说,如果我想要返回的是路径,我倾向于避免使用match,因为使用match,路径将包含由步骤执行的完整评估,这通常不是我想要/需要的。
  • 没错,匹配的路径结果。 @KelvinLawrence

标签: gremlin tinkerpop


【解决方案1】:

一般而言,我不会对此类查询使用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],v[1],e[5120][1-route->135],v[135],[b:v[135],lba:v[1]]]    

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

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').
......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 将长篇大论,写满你可能不感兴趣的东西。

【讨论】:

  • 谢谢!我已将 .as 添加到匹配的整个关系中。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2022-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多