Gremlin入门:如何从路径中提取顶点值而非顶点ID
嘿,我懂你现在的困扰!你想把Gremlin返回的路径从[v[25],v[28]]这种顶点ID形式,转换成['Sales', 'Accounting']对应的顶点属性值列表,但用unfold()之后结果完全不是你想要的一一映射结构,对吧?
为什么之前的方法行不通?
你用path().unfold().values()的时候,unfold()会把每条路径里的顶点都拆成单独的元素,再调用values()就会把所有顶点的属性值平铺输出,丢失了原本的路径分组——比如原本两条路径[v1,v2]和[v3,v4],会变成val1, val2, val3, val4,而不是保留[val1,val2]、[val3,val4]的结构。
正确的解决方案:用path().by()修饰路径输出
想要让路径里的每个元素直接显示对应的属性值,不需要unfold(),而是用path()的by()方法来指定每个顶点要提取的属性。
情况1:所有顶点都取同一个属性(比如name)
直接在path()后面加.by('属性名')就行,比如你的查询可以改成这样:
g.V().hasLabel('Process').repeat(both().simplePath()).until(hasLabel('Process')).dedup().path().by('name')
这里假设你的顶点存储名称的属性是name,如果是其他属性(比如title),换成对应的属性名就行。执行后返回的每条路径就会是类似['Sales', 'Accounting']的形式,完美对应原来的顶点路径结构。
情况2:不同类型的顶点需要取不同属性
如果路径里包含多种标签的顶点,每种顶点要取不同属性,可以用choose()来做条件判断:
g.V().hasLabel('Process').repeat(both().simplePath()).until(hasLabel('Process')).dedup().path() .by(choose(label().is('Process'), values('processName'), values('deptName')))
这个例子里,标签为Process的顶点取processName属性,其他顶点取deptName属性,灵活适配不同的顶点类型。
验证效果
执行修改后的查询,你会看到每条结果都是完整的属性值列表,和你期望的['Sales', 'Accounting']结构完全一致,不需要额外处理就能直接拿到分组好的路径值~
内容的提问来源于stack exchange,提问作者Srinath Ganesh

