Jagged Result Array Gremlin Query - PullRequest
       25

Jagged Result Array Gremlin Query

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

Не могли бы вы помочь мне написать запрос, который возвращает каждую исходную вершину в моем обходе вместе с соответствующими ребрами и вершинами в виде массивов на каждой такой исходной вершине? Короче говоря, мне нужен результирующий набор, содержащий массив из 3 кортежей, в котором элемент 1 каждого кортежа является исходной вершиной, а элементы 2 и 3 - ассоциированными массивами.

Спасибо!

РЕДАКТИРОВАТЬ1: Расширил данные графика и добавил мой текущий проблемный запрос. РЕДАКТИРОВАТЬ 2: Улучшенный пример кода графа Gremlin (извините, я не думал, что кто-нибудь на самом деле его запустит).

Пример графика

g.addV("blueprint").property("name","Mall").
addV("blueprint").property("name","HousingComplex").
addV("blueprint").property("name","Airfield").
addV("architect").property("name","Tom").
addV("architect").property("name","Jerry").
addV("architect").property("name","Sylvester").
addV("buildingCategory").property("name","Civil").
addV("buildingCategory").property("name","Commercial").
addV("buildingCategory").property("name","Industrial").
addV("buildingCategory").property("name","Military").
addV("buildingCategory").property("name","Resnameential").
V().has("name","Tom").addE("designed").to(V().has("name","HousingComplex")).
V().has("name","Tom").addE("assisted").to(V().has("name","Mall")).
V().has("name","Jerry").addE("designed").to(V().has("name","Airfield")).
V().has("name","Jerry").addE("assisted").to(V().has("name","HousingComplex")).
V().has("name","Sylvester").addE("designed").to(V().has("name","Mall")).
V().has("name","Sylvester").addE("assisted").to(V().has("name","Airfield")).
V().has("name","Sylvester").addE("assisted").to(V().has("name","HousingComplex")).
V().has("name","Mall").addE("classification").to(V().has("name","Commercial")).
V().has("name","HousingComplex").addE("classification").to(V().has("name","Resnameential")).
V().has("name","Airfield").addE("classification").to(V().has("name","Civil"))

Обратите внимание, что приведенное выше оченьупрощенный рендеринг наших данных.

Необходимые результаты запроса

Мне нужно вернуть каждую вершину светокопии в качестве основы с каждым из связанных с ней ребер / вершин в виде массивов.

Мое текущее решение

В настоящее время я делаю этот очень громоздкий запрос, который получает чертежи и назначает метку, получает архитекторов и назначает метку, а затем выбирает обе метки. Решение в порядке;тем не менее, это может привести к путанице, когда мне нужно добавить ребра или получить вершины классификации проекта (промышленные, военные, жилые, коммерческие и т. д.). По сути, чем больше связанных данных мне нужно получить для каждого проекта, тем медленнее становится мое решение.

Мой текущий запрос выглядит примерно так:

g.V().hasLabel("blueprint").as("blueprints").
outE().or(hasLabel("designed"),hasLabel("assisted")).inV().as("architects").
select("blueprints").coalesce(out("classification"),constant()).as("classifications").
select("blueprints","architects","classifications")

выше производит много дублирования. Если число: чертежей равно b, архитекторов - а, а классификаций - с, набор результатов содержит результаты b * a * c. Я хотел бы один план с массивом связанных с ним архитекторов и массивом связанных с ним классификаций, если таковые имеются.

Осложнения

Я пытаюсь сделать это в одном запросетак что я могу получить все данные проекта из графика, чтобы заполнить отфильтрованный список. Когда у меня есть список, включающий все вершины, ребра и их свойства, пользователи могут затем нажимать ссылки на большие двоичные объекты, просматривать сайты проектов и т. Д. Соответственно, у меня есть нумерация страниц, а также фильтрация, и я быЯ предпочитаю совершать одну поездку на сервер каждый раз, когда я получаю новую страницу или меняю фильтры.

1 Ответ

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

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

g.V().hasLabel("blueprint").
project("blueprints","architects").
by().
by(outE().or(hasLabel("designed"),hasLabel("assisted")).inV().dedup().fold())

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

Возможно, мне придется просто получить чертежи в одном запросе, получить каждый из связанных с ними элементов в параллельных запросах, а затем собрать их все вместе в API. Это было бы очень плохо для уровня данных API, но может быть необходимо по соображениям производительности.

...