如何解析这段Gremlin多节点与边遍历查询语句?
Gremlin多节点与边遍历查询解析
对应遍历路径
该查询要匹配的图遍历路径为:A(节点)<--W(边)<--B(节点)-->X(边)-->C(节点)-->Y(边)-->D(节点)<--Z(边)<--E(节点)
查询代码
g.V().hasLabel("A").as("A"). inE("W").as("W"). outV(). hasLabel("B").as("B"). outE("X").as("X"). inV(). hasLabel("C").as("C"). outE("Y"). has("Y property","10000").as("Y"). inV(). hasLabel("D").as("D"). inE("Z").as("Z"). outV(). hasLabel("E").as("E"). select("A","W","B","X","C","Y","Y","D","Z","E") .by(valueMap()).toList()
执行逻辑与遍历过程
我们可以把整个查询按执行顺序拆解为以下步骤,每一步对应图中节点/边的匹配逻辑:
- 起始节点定位:
g.V().hasLabel("A").as("A")
从图中所有节点里筛选出标签为A的节点,并用as("A")给该节点绑定别名,方便后续引用。 - 反向遍历边W到节点B:
inE("W").as("W").outV().hasLabel("B").as("B")inE("W"):从节点A出发,遍历所有指向它的、标签为W的入边,绑定别名W;outV():从这条W边出发,找到边的起点(即W边连接的另一端节点);hasLabel("B").as("B"):筛选该起点节点标签为B,并绑定别名B。
- 正向遍历边X到节点C:
outE("X").as("X").inV().hasLabel("C").as("C")outE("X"):从节点B出发,遍历所有从它指向外部的、标签为X的出边,绑定别名X;inV():从这条X边出发,找到边的终点;hasLabel("C").as("C"):筛选终点节点标签为C,绑定别名C。
- 带属性条件遍历边Y到节点D:
outE("Y").has("Y property","10000").as("Y").inV().hasLabel("D").as("D")outE("Y"):从节点C出发,遍历标签为Y的出边;has("Y property","10000"):额外筛选出Y property属性值为10000的Y边,绑定别名Y;inV():找到这条Y边的终点;hasLabel("D").as("D"):筛选终点节点标签为D,绑定别名D。
- 反向遍历边Z到节点E:
inE("Z").as("Z").outV().hasLabel("E").as("E")inE("Z"):从节点D出发,遍历所有指向它的、标签为Z的入边,绑定别名Z;outV():从这条Z边出发,找到边的起点;hasLabel("E").as("E"):筛选该起点节点标签为E,绑定别名E。
- 结果提取与格式化:
select("A","W","B","X","C","Y","Y","D","Z","E").by(valueMap()).toList()select(...):按照指定的别名顺序,提取之前绑定的所有节点和边(注意这里重复指定了Y,最终结果会包含两份Y边的属性信息);.by(valueMap()):指定提取每个元素的所有属性键值对;.toList():将最终匹配结果转换为列表形式返回。
内容的提问来源于stack exchange,提问作者Ankit Soni
相关产品推荐
相关产品推荐

