2

我想知道是否有一种简单的方法可以从 Java 程序中向远程图添加边。目前,我有:

  • Gremlin-Server 运行的实例 (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应用程序只能通过client.submitAsync()方法提交Gremlin查询与服务器通信(对吧?)。

我的问题如下:我要查找两个顶点,如果它们都存在,则在它们之间创建一条边。如果 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 对象?
4

1 回答 1

3

不能提交多行语句吗?我从来没有尝试过,但我会说它应该工作。

但是,我们目前正在努力使这更容易,但现在您也可以这样做(如果您需要单线):

g.V().has('name', fromParam).as('from').map {
    g.V().has('name', toParam).tryNext().orElse(false)
}.is(neq, false).addInE('knows', 'from')

以下示例显示了此方法如何对现有和不存在的顶点执行:

gremlin> g = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V().has("name","marko").out("created")
==>v[3]
gremlin> g.V().has("name","marko").as("from").map {
             g.V().has("name", "riple").tryNext().orElse(false)
         }.is(neq, false).addInE("created", "from") // riple doesn't exist, hence no edge is being created
gremlin> g.V().has("name","marko").out("created")
==>v[3]
gremlin> g.V().has("name","marko").as("from").map {
             g.V().has("name", "ripple").tryNext().orElse(false)
         }.is(neq, false).addInE("created", "from") // ripple does exist, hence a new edge is being created
==>v[5]
gremlin> g.V().has("name","marko").out("created")
==>v[3]
==>v[5]
于 2015-02-11T23:16:21.030 回答