TP3:Gremlin遍历并使用Java客户端远程添加边缘

时间:2015-02-11 16:00:27

标签: java neo4j client-server gremlin tinkerpop3

我想知道是否有一种从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
  • 启动
  • 包含连接到它的Client对象的Java应用程序。

据我所知,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对象,就好像它是本地的一样?

1 个答案:

答案 0 :(得分: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]