Я хотел бы знать, есть ли простой способ добавления ребер к удаленному графу из программы Java. В настоящее время у меня есть:
- экземпляр запущенного сервера Gremlin (TP 3.0.0.M7), который позволяет подключаться к графу Neo4j.
gremlin-server.sh -i com.tinkerpop neo4j-gremlin 3.0.0.M7
был выполнен заранее, а сервер запущен сgremlin-server.sh conf/remote-objects.yaml
- приложение Java, содержащее
Client
объект, который к нему подключается.
Насколько мне известно, приложение Java может взаимодействовать с сервером только путем отправки запросов Gremlin через метод client.submitAsync()
(верно?).
Моя проблема заключается в следующем: Я бы нашел две вершины, и, если они обе существуют, создать границу между ними. Если бы сам объект Graph был доступен в моем приложении Java, это было бы так же просто, как и в локальной консоли Gremlin. Я бы просто написал Java-эквивалент
gremlin> v = g.addVertex('name', 'Hank')
==>v[16]
gremlin> v2 = g.addVertex('name', 'Pete')
==>v[18]
gremlin> v.addEdge('knows', v2)
==>e[20][16-knows->18]
gremlin>
Добавить ребро к графу на удаленном сервере сложнее, так как мне нужно сначала найти две вершины, прежде чем добавлять ребро между ними. Мой код Java для этого выглядит следующим образом:
//The params object is a Map that binds `fromParam` and `toParam` to strings Hank and Pete, respectively
ResultSet r = client.submitAsync("g.V().has('name', fromParam)", params).get();
ResultSet r2 = client.submitAsync("g.V().has('name', toParam)", params).get();
Это возвращает мне два DetachedVertex
объекта. Третий запрос на добавление ребра между ними:
// outVertex and inVertex are the DetachedVertex objects added to params
ResultSet r3 = client.submitAsync("outVertex.attach(g).addEdge('knows', inVertex.attach(g))", params).get();
Похоже, это сработало, но я поставил меня в тупик на пару часов и кажется огромной проблемой для такой элементарной операции. Поэтому мои вопросы заключаются в следующем:
- Есть ли запрос Gremlin, который может объединить эти три запроса? Т.е. Могу ли я найти и добавить ребро между двумя несвязанными вершинами в одном запросе?
- Или существует ли способ для программы Java достичь удаленного объекта Graph, как если бы он был локальным?
g.V('name', 'Hank').addEdge('knows', g.V('name', 'Pete'))
? - person Faber   schedule 11.02.2015g.V('name', 'Hank').next().addEdge('knows', g.V('name', 'Pete').next())
- person Faber   schedule 11.02.2015g.V()
дважды в одном запросе допустимо! Я полагаю, добавление некоторыхcount()
шагов также позволяет проверять наличие дубликатов. Да, и это должно бытьg.V().has('name', 'Hank')
вместоg.V('name', 'Hank')
, но это легко исправить :) Приветствую. Ответ на мой второй вопрос, наверное, нет, верно? - person rvw   schedule 12.02.2015g.V('name', 'Hank')
вместоg.V().has('name', 'Hank')
, не знаю, работает ли это также с вашим подходом удаленного доступа. Я предполагаю, что первый вариант более эффективен, если вы создали индекс для «имени». Последний всегда перебирает все вершины, чего вы не хотите делать. См. Gremlindocs: gremlindocs.com/#transform/v - person Faber   schedule 12.02.2015