如何解决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
会很长而且充满了您可能不感兴趣的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。