Gremlin - лучший способ выбрать свойства из нескольких вершин в одном запросе - PullRequest
0 голосов
/ 25 октября 2019

У меня есть две связанные вершины с метками «DeviceFamily» и «Device». Они связаны, как показано ниже:

(DeviceFamily)-[:RELATION]->(Device)

У вершины DeviceFamily есть несколько свойств, скажем, p, q, r, а у вершины Device есть свойства, скажем, x, y, z.

Для данного устройстваid, если мне требуется выяснить свойства x, y, z соответствующей вершины устройства и свойства p, q, r связанной DeviceFamily, какой запрос я должен выполнить?

Одно решение, которое я нашел, это:

g.V('<id>').hasLabel('Device').as('d1', 'd2', 'd3').inE('RELATION').outV().as('f1', 'f2', 'f3').select('d1', 'd2', 'd3', 'f1', 'f2', 'f3').by('x', 'y', 'z', 'p', 'q', 'r');

Этот запрос работает, но я не уверен, что это лучший способ сделать это. Пожалуйста, дайте мне знать, если есть лучший способ.

Спасибо.

1 Ответ

0 голосов
/ 25 октября 2019

Я думаю, что вам следует использовать некоторую форму project():

g.V('<id>').
  project('device','family').
    by(__.valueMap('x','y','z'))
    by(__.in('RELATION').valueMap('p','q','r'))

Обратите внимание, что я опустил hasLabel('Device'), поскольку он избыточен, поскольку вы знаете уникальный идентификатор для вершины. Также обратите внимание, что хотя я использовал valueMap() в by() модуляторах project(), вы могли легко предоставить любой Gremlin, который вам нужен, для формирования ваших данных в эти два ключа (я просто выбрал valueMap(), поскольку это удобно для записи).

Если вы хотите, чтобы что-то более соответствовало вашему выводу, вы все равно могли бы использовать project() таким прямым способом (я предполагал, что есть только один край "ОТНОШЕНИЯ" - надеюсь, что это так):

g.V('<id>').
  project('x','y','z','p','q','r').
    by('x').
    by('y').
    by('z').
    by(in('RELATION').values('p')).
    by(in('RELATION').values('q')).
    by(in('RELATION').values('r'))

Я не думаю, что большинство графовых баз данных оптимизируют последние три by() модулятора для одного обхода через край "СВЯЗЬ". Поэтому я бы предложил небольшую корректировку - вместо этого project() край:

g.V('<id>').
  inE('RELATION').
  project('x','y','z','p','q','r').
    by(inV().values('x')).
    by(inV().values('y')).
    by(inV().values('z')).
    by(outV().values('p')).
    by(outV().values('q')).
    by(outV().values('r'))
...