Матрица расстояний Гремлина с несколькими краевыми свойствами пути

Я новичок в гремлине, пожалуйста, помогите мне с запросом данных графика ниже.

График выборки Гремлина

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]

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


person Pavan Kumar R R    schedule 22.04.2019    source источник


Ответы (2)


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

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.

person stephen mallette    schedule 22.04.2019
comment
Спасибо @stephen. Это сработало, каково влияние на производительность, если я получу полмиллиона строк с помощью этого запроса? - person Pavan Kumar R R; 23.04.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), на мой взгляд, просто пустая трата ресурсов.

person Daniel Kuppitz    schedule 22.04.2019
comment
Спасибо @Daniel. Это сработало, каково влияние на производительность, если я получу полмиллиона строк с помощью этого запроса? - person Pavan Kumar R R; 23.04.2019
comment
Я бы сказал, это очень плохо. Запросы OLTP-графиков не должны получать так много данных, если вас действительно не заботит длительное время ответа. - person Daniel Kuppitz; 23.04.2019
comment
Мое требование: у меня есть полностью связанный граф, и я хочу получить матрицу расстояний, используя упомянутый вами запрос. Как лучше всего этого добиться? График будет содержать около 2000 узлов, которые полностью подключены, и в любой момент времени я хочу получить матрицу данных о расстоянии 500X500 узлов. - person Pavan Kumar R R; 23.04.2019