Используя функцию ArangoDB EDGES, невозможно получить правильную вершину с параметрами includeVertices

Используя ArangoDB для описания дружеских отношений, я хочу знать друзей конкретного пользователя A. Поскольку это тестовый образец, я знаю, что A дружит с B.

У меня есть пользователи в коллекции документов и в коллекции edge, содержащей информацию от «_from», являющегося другом для «_to». Если A является другом B, B должен быть другом A. то есть: если есть ребро _ от A _ к B, другое ребро _ от B _ к A существует.

Я использую функцию EDGES в моей коллекции друзей, чтобы узнать, кто из друзей пользователя «u4», _id которого равен 2465087832. Он должен дружить с «u1», который _id равен 2462335320. Потому что я хочу иметь больше, чем просто идентификатор документа, я установил для параметра includeVertices значение true.

Вот моя просьба.

LET out = EDGES(friends, "db/2465087832", "outbound", null, {includeVertices: true})

И ответ:

[
    {
      "edge": {
        "_id": "db/2468102488",
        "_from": "db/2465087832",
        "_to": "db/2462335320",
        "_rev": "2468102488",
        "_key": "2468102488"
      },
      "vertex": {
        "_id": "db/2465087832",
        "_key": "2465087832",
        "_rev": "3962323288",
        "id": "u4"
      }
    }
  ]

В результате у меня хорошее ребро (u4 дружит с u1), но включенная вершина принадлежит запрошенному пользователю (id: u4). Я пробовал использовать в качестве направления «входящий», а не «исходящий».

LET out = EDGES(friends, "db/2465087832", "inbound", null, {includeVertices: true})

И вот результат:

 [
    {
      "edge": {
        "_id": "db/2468364632",
        "_from": "db/2462335320",
        "_to": "db/2465087832",
        "_rev": "2468364632",
        "_key": "2468364632"
      },
      "vertex": {
        "_id": "db/2465087832",
        "_key": "2465087832",
        "_rev": "3962323288",
        "id": "u4"
      }
    }
  ]

Как видите, вершина остается "u4", даже если ребро хорошее (u1 дружит с u4).

Наконец, я попытался использовать «любое» как направление.

LET any = EDGES(friends, "db/2465087832", "any", null, {includeVertices: true})

И удивительный ответ:

[
    {
      "edge": {
        "_id": "friends/2468364632",
        "_from": "user/2462335320",
        "_to": "user/2465087832",
        "_rev": "2468364632",
        "_key": "2468364632"
      },
      "vertex": {
        "_id": "user/2462335320",
        "_rev": "3956687192",
        "_key": "2462335320",
        "id": "u1"
      }
    },
    {
      "edge": {
        "_id": "friends/2468102488",
        "_from": "user/2465087832",
        "_to": "user/2462335320",
        "_rev": "2468102488",
        "_key": "2468102488"
      },
      "vertex": {
        "_id": "user/2462335320",
        "_rev": "3956687192",
        "_key": "2462335320",
        "id": "u1"
      }
    }
  ]

Здесь ответ содержит оба ребра (от A до B и от B до A), что правильно, но для обоих вершина - это вершина от u1. Эти три результата кажутся несовместимыми: для «входящего» / «исходящего»: вершина была u4, а для «любого» вершиной была «u1». В моем коде есть ошибка? Вариант, который я должен использовать?

Спасибо,

BobCitron


person BobCitron    schedule 21.09.2015    source источник


Ответы (1)


большое спасибо, что заметили это, на самом деле это ошибка в нашем ядре, а не в вашем коде

Я только что исправил это, и он будет включен в следующую версию 2.6. выпуск исправления ошибок и в 2.7 (devel). Ожидаемое поведение такое, как вы описываете.

Вам действительно нужна информация, хранящаяся в Edges? В противном случае вы могли бы рассмотреть возможность использования функции NEIGHBORS в этом случае, которая более производительна.

person mchacki    schedule 22.09.2015
comment
По сути, для этого достаточно использовать СОСЕДЕЙ. Рад помочь вам в разработке этого инструмента :) - person BobCitron; 22.09.2015