Объединить список вершин в gremlin orientDb - PullRequest
0 голосов
/ 09 января 2020

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

g.V().hasLabel('Group').has('GroupId','G001').repeat(
    outE().inV()
).emit().hasLabel('User').as('UsersList1')

.V().has('UserId', within('001','002')).as('UsersList2')

.select('UsersList1','UsersList2').dedup().values('petitions').sum().unfold()

С уважением

Ответы [ 2 ]

2 голосов
/ 12 января 2020

В вашем запросе есть несколько ошибок:

  • вы звоните V().has('UserId', within('001','002')) для каждого пользователя, который был найден в первой части обхода
  • обход может испускать больше чем только листы
  • select('UsersList1','UsersList2') создает пары пользователей
  • values('petitions') пытается получить доступ к свойству petitions каждой пары, это всегда будет неудачным

Правильный подход будет:

g.V().has('User', 'UserId', within('001','002')).fold().
  union(unfold(),
        V().has('Group','GroupId','G001').
            repeat(out()).until(hasLabel('User'))).
  dedup().
  values('petitions').sum()
2 голосов
/ 10 января 2020

Я не проверял это, но думаю, что подойдет следующее:

g.V().union(
    hasLabel('Group').has('GroupId','G001').repeat(
        outE().inV()
    ).until(hasLabel('User')),
    has('UserId', within('001','002')))
.dedup().values('petitions').sum()

Чтобы получить только листья дерева, лучше использовать until. Использование emit также выведет все внутренние узлы дерева. union объединяет два внутренних обхода.

...