Создание ребер в Tinkerpop3 на основе свойств вершин? - PullRequest
0 голосов
/ 09 января 2019

Я работаю над переносом информации из другой базы данных в базу данных Tinkerpop, используя TinkerPop3 Java. У меня есть большое количество идентификаторов, хранящихся в одной вершине, которые мне нужно преобразовать в ребро между двумя вершинами.

Допустим, я запустил следующий код, чтобы создать граф игрушек Modern, и добавил свойство «друг» Джоша с соответствующим именем его друга «Марко».

graph = TinkerFactory.createModern()
g = graph.traversal()
g.V().has("name","josh").property("friend","marko")

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

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

g.V().has("friend").as("a").values("friend").as("b").select("a","b")

Спасибо !!

1 Ответ

0 голосов
/ 10 января 2019

Я нашел следующее сработало:

g.V().has("friend").as("x").
V().has("name").where(eq("x")).by("name").by("friend").
as("y").
addE("friends").from("x").to("y")

вдохновленный ответом, найденным здесь: https://groups.google.com/forum/#!msg/gremlin-users/l-Xtknn3Loo/0SljkNFiDQAJ;context-place=forum/gremlin-users

Объяснение: Запрос находит ряд узлов с друзьями, помечая их "x". Затем он просматривает все узлы с именами и помечает их как «y», если они совпадают, то есть, если их имя соответствует свойству друга «x». (Это то, что делают два оператора .by ()). Тогда это создает грань между ними.

...