gremlin - 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,我无法检索“边缘”
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
对此类查询使用步骤,但这里有一些示例。如果您希望边缘出现在 a 中,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
推荐阅读
- python - 为什么 ndarray 函数作为不可变对象
- pandas - Pandas - 将嵌套的 json 分成多行
- postgresql - PostgreSQL 采用最长的一列数组
- yaml - 尝试将 yaml 文件闪存到 ESP8266 时出错
- ionic-framework - 产品构建中的离子巨大 svg 文件夹
- php - 如果名称来自数据库的数组,如何插入数据库,因为我们不知道将来会有多少数组
- java - Java Maven错误无效标志--add-opens
- swift - 删除 SwiftUI 中 NavigationLink 上 ContextMenu 的模糊预览
- javascript - 如何遍历flutter web中的嵌套子集合?
- java - Java:将文件中的对象读入不同的派生类