Создайте запрос на соединение с данными из ребра и связанной вершины

У меня есть Gremlin API Cosmos DB. В БД у меня есть один тип вершин с меткой User, которые подключены к вершинам с меткой Companies. Затем я хочу показать все подключенные компании. Я делаю запрос g.V('id-of-User').outE() и получаю все подключенные компании. Результат может выглядеть примерно так:

[
  {
    "id": "08f97a1d-9e81-4ccc-a498-90eb502b1879",
    "label": "AuthorizedSignatory",
    "type": "edge",
    "inVLabel": "Company",
    "outVLabel": "User",
    "inV": "abd51134-1524-44fe-8a49-60d2d449a1f3",
    "outV": "103bf1b9-464f-4f68-a4ca-7dfdbe94ae84"
  },
  {
    "id": "c36b640b-9574-403b-8ab6-fcce695caa90",
    "label": "AuthorizedSignatory",
    "type": "edge",
    "inVLabel": "Company",
    "outVLabel": "User",
    "inV": "2c14d279-00a4-41ad-a8c0-f3b882864568",
    "outV": "103bf1b9-464f-4f68-a4ca-7dfdbe94ae84"
  }
]

Это абсолютно ожидаемо. Теперь я хочу пойти дальше и вместо того, чтобы просто показывать GUID в параметре inV, я также хочу включить название компании в объект результата, но я не понимаю, как здесь сделать эквивалент SQL-соединения.

Может кто-нибудь, пожалуйста, помогите мне!!

То, что я хочу, похоже на пример ниже:

[
  {
    "id": "08f97a1d-9e81-4ccc-a498-90eb502b1879",
    "label": "AuthorizedSignatory",
    "type": "edge",
    "inVLabel": "Company",
    "outVLabel": "User",
    "inV": "abd51134-1524-44fe-8a49-60d2d449a1f3",
    "outV": "103bf1b9-464f-4f68-a4ca-7dfdbe94ae84",
    "CompanyName": "ACME CORP"
  },
  {
    "id": "c36b640b-9574-403b-8ab6-fcce695caa90",
    "label": "AuthorizedSignatory",
    "type": "edge",
    "inVLabel": "Company",
    "outVLabel": "User",
    "inV": "2c14d279-00a4-41ad-a8c0-f3b882864568",
    "outV": "103bf1b9-464f-4f68-a4ca-7dfdbe94ae84",
    "CompanyName": "Giganticorp"
  }
]

Где CompanyName — это одно из свойств в Company Vertice с guid в inV prop.


person Magnus Jansson    schedule 12.04.2019    source источник


Ответы (1)


Нет никакого "присоединения". Данные уже связаны через ребро, поэтому вам просто нужно пройти дальше по вашему графику, чтобы получить «CompanyName».

g.V('id-of-User').out().values("CompanyName")

Это показывает вам все названия компаний, связанных с этим пользователем. Если вы говорите, что по-прежнему хотите отображать данные с края в дополнение к названию компании, как в ваших примерах, то нет проблем, project() край указывает на то, что вы хотите:

g.V('id-of-User').outE().
  project('eid','label','companyName').
    by(T.id).
    by(T.label).
    by(inV().values("CompanyName"))

Опять же, обратите внимание, что для «CompanyName» нет «присоединения». Поскольку данные неявно соединяются через ребро, вам просто нужно пройти через inV(), чтобы получить там данные.

person stephen mallette    schedule 12.04.2019
comment
Спасибо. Это сделало именно то, что я хотел. :D Я знаю, что соединений нет, поэтому я сказал эквивалентно, чтобы понять, чего я хотел. Спасибо большое Степан... - person Magnus Jansson; 12.04.2019
comment
Хорошо, я забил на объединение только потому, что мы получаем много вопросов, когда люди пытаются выполнять SQL-подобные соединения без ребер, например, сопоставлять две несвязанные вершины по значениям их свойств. в большинстве случаев это плохо работает для графовых запросов, если только вы не сильно ограничили количество вершин, которым хотите сопоставить таким образом. - person stephen mallette; 12.04.2019