具有路径的多个边缘属性的Gremlin距离矩阵

问题描述 投票:0回答:2

我是gremlin的新手,请帮我查询下面的图表数据。

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]

想要在结果中拥有所有路径边缘属性而没有任何内部结果。请帮助我如何达到预期的效果?

azure-cosmosdb gremlin tinkerpop gremlin-server
2个回答
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
投票

除了斯蒂芬已经说过的话,你还可以在你的路径步骤中摆脱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)只是浪费资源。

© www.soinside.com 2019 - 2024. All rights reserved.