我是gremlin的新手,请帮助我查询以下图形数据。
克里姆林宫样本图
graph = TinkerGraph.open()
g = graph.traversal()
v1 = g.addV('4630').property('loc','B_1_1').next()
v2 = g.addV('4630').property('loc','C_1_1').next()
e1 = g.addE('sp').from(v1).to(v2).property('dist',1).property('anglein',90).property('angleout',45).next()
e2 = g.addE('sp').from(v2).to(v1).property('dist',2).property('anglein',190).property('angleout',145)
预期结果:
source destination dist angein angleout
B_1_1 C_1_1 1 90 145
C_1_1 B_1_1 2 190 145
我正在尝试的查询是:
g.V().has('4630','loc',within('B_1_1','C_1_1')).
outE('sp').
inV().has('4630','loc',within('B_1_1','C_1_1')).
path().
by('loc').
by(valueMap().select(values)).
by('loc')
结果不理想
==>[B_1_1,[90,1,45],C_1_1]
==>[C_1_1,[190,2,145],B_1_1]
想要在结果中具有所有路径边缘属性,而没有任何内部结果。请帮我如何达到预期的效果?
答案 0 :(得分:1)
听起来您只是想弄平结果。
gremlin> g.V().has('4630','loc',within('B_1_1','C_1_1')).
......1> outE('sp').
......2> inV().has('4630','loc',within('B_1_1','C_1_1')).
......3> path().
......4> by('loc').
......5> by(valueMap().select(values)).
......6> by('loc').
......7> map(unfold().unfold().fold())
==>[B_1_1,90,1,45,C_1_1]
==>[C_1_1,190,2,145,B_1_1]
每个路径都需要展平,因此您想对map()
应用该操作。要展平,您需要先unfold()
路径,然后unfold()
路径中的每个项目。由于map()
操作只会对子遍历进行next()
,因此您需要包括最后的fold()
才能将平整的对象流转换回List
。
答案 1 :(得分:1)
除了斯蒂芬已经说过的话,您还可以在路径步骤中摆脱by()
调制,而使用路径元素来收集之后需要的所有值。这样可以为您节省一些遍历,因此速度应该会更快。
g.V().has('4630','loc',within('B_1_1','C_1_1')).
outE('sp').inV().has('4630','loc',within('B_1_1','C_1_1')).
path().
map(unfold().values('loc','dist','anglein','angleout').fold())
此外,请注意,即使您喜欢其他查询,也不应使用valueMap
。我认为valueMap().select(values)
只是浪费资源。