Gremlin:检索包含匹配边的路径
Gremlin: Retrieve Path which includes edges with match
我正在学习 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
步骤为其添加标签。我使用 air-routes 数据集来生成这些示例。
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]]
Match 在这种情况下(如下)会很方便,但即便如此,您也可以仅使用 where
步来表达这一点(这会找到没有 return 返回路线的路线到出发机场)。
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
会很长并且充满您可能不感兴趣的内容。
我正在学习 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
步骤为其添加标签。我使用 air-routes 数据集来生成这些示例。
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]]
Match 在这种情况下(如下)会很方便,但即便如此,您也可以仅使用 where
步来表达这一点(这会找到没有 return 返回路线的路线到出发机场)。
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
会很长并且充满您可能不感兴趣的内容。