Как с Gremlin вернуть свойства из вершин так же, как я из внешних вершин?(Не как массивы) - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь начать обход с одного набора помеченных вершин, затем соединить все их вершины с определенным видом ребра, а затем вернуть свойство этих вершин как объекты.Я могу сделать то же самое с некоторыми внешними вершинами, начинающимися с того же набора помеченных вершин без проблем, но получить сообщение об ошибке «Предоставленный traverser не сопоставляется со значением:», когда я пытаюсь сделать это с некоторыми внутренними вершинами.

Я нашел обходной путь, но он не идеален, так как он возвращает желаемые значения свойств в виде массивов длины один.

Вот как я успешно выполняю очень похожую задачу с внешними вершинами: g.V().hasLabel('TestCenter').project('address').by(out('physical').project('street').by(values('street1')))

Это возвращает такие вещи, как

==>{address={street=561 PLACE DE CEDARE}}
==>{address={street=370 N BLACK STATION AVE}}

Это здорово!

Затем я пытаюсь выполнить такой же запрос с некоторыми вершинами, например: g.V().hasLabel('TestCenter').project('host').by(__.in('hosts').project('aCode').by(values('code'))), и получаю вышеупомянутую ошибку.

Обходной путь, который я смог найти, заключается в добавлении .fold () к окончательному «by», например: g.V().hasLabel('TestCenter').project('host').by(__.in('hosts').project('aCode').by(values('code')).fold()), но тогда мои ответы будут такими:

==>{host=[{aCode=7387}]}
==>{host=[{aCode=9160}]}

Мне бы хотелось, чтобы ответ выглядел следующим образом:

==>{host={aCode=4325}}
==>{host={aCode=1234}}

(Примечание: я не уверен, что это актуально, но я подключаю Gremlin к экземпляру БД Neptune)

1 Ответ

2 голосов
/ 03 июля 2019

Из вышеприведенной ошибки и вашего обходного пути мне кажется, что не все ваши «TestCenter» имеют преимущество от типа «hosts».При использовании project необходимо сопоставить действительное значение.

вы можете сделать две вещи:

1) убедиться, что значение будет возвращено в project:

g.V().hasLabel('TestCenter').project('host')
     .by(coalesce(__.in('hosts').project('aCode').by(values('code')), constant('empty')))

2) фильтр делает значения:

g.V().hasLabel('TestCenter').where(__.in('hosts'))
.project('host').by(__.in('hosts').project('aCode').by(values('code')))
...