我想知道是否有一种从Java程序中向远程图添加边的简单方法。目前,我有:
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();
这似乎有效,但它让我难以忍受了几个小时,对于这样的基本操作来说似乎是一个巨大的麻烦。因此,我的问题如下:
答案 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]