gpt4 book ai didi

java - TP3 : Gremlin traversal and adding edges remotely with Java client

转载 作者:行者123 更新时间:2023-11-30 08:16:10 25 4
gpt4 key购买 nike

我想知道是否有一种简单的方法可以从 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 查询? IE。我可以在单个查询中查找并在两个断开连接的顶点之间添加一条边吗?
  • 或者,有没有办法让 Java 程序像到达本地一样到达远程 Graph 对象?

最佳答案

不能提交多行声明吗?我从未尝试过,但我认为它应该有效。

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

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]

关于java - TP3 : Gremlin traversal and adding edges remotely with Java client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28458813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com