Матрица расстояний Gremlin с несколькими реберными свойствами пути - PullRequest
0 голосов
/ 22 апреля 2019

Я новичок в 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]

Хотите иметь все свойства края пути в результате без какого-либо внутреннего результата. Пожалуйста, помогите, как мне достичь ожидаемого результата?

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

В дополнение к тому, что Стивен уже сказал, вы также можете избавиться от модуляции 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) это просто пустая трата ресурсов на мой взгляд.

1 голос
/ 22 апреля 2019

Похоже, вы просто хотите сгладить результат.

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.

...