如何在单个gremlin查询中添加多条边?

如何在单个gremlin查询中添加多条边?,gremlin,tinkerpop3,Gremlin,Tinkerpop3,我的方案是在单个查询中在顶点之间添加多条边: 假设以下节点: 这些是我的标签和ID 用户: 4100 歌曲: 4200 4355 4676 我必须在这些顶点之间建立边 4100 --> 4200, 4100 --> 4355, 4100 --> 4676. 我们通常可以通过在节点之间创建单条边来实现。如果我们希望一次在50多个顶点之间创建边,那么这不是一种有效的方法。我正在使用Tinkerpop3.0.1 如果您有顶点id,则按id查找是非常有效的。如果您使用的是Grem

我的方案是在单个查询中在顶点之间添加多条边:

假设以下节点: 这些是我的标签和ID

用户

4100

歌曲

4200

4355

4676

我必须在这些顶点之间建立边

4100 --> 4200, 
4100 --> 4355, 
4100 --> 4676.

我们通常可以通过在节点之间创建单条边来实现。如果我们希望一次在50多个顶点之间创建边,那么这不是一种有效的方法。我正在使用Tinkerpop
3.0.1

如果您有顶点id,则按id查找是非常有效的。如果您使用的是Gremlin Server,则对Gremlin Server的每个请求都被视为单个事务。您可以在一个请求(带有绑定)上传递Gremlin查询中的多个语句,而不是发送多个请求。用分号分隔Gremlin查询中的语句

l=[4200, 4355, 4676]; v=graph.vertices(4100).next(); l.each { v.addEdge("knows", graph.vertices(it).next()) }

如果您有顶点id,则按id查找非常有效。如果您使用的是Gremlin Server,则对Gremlin Server的每个请求都被视为单个事务。您可以在一个请求(带有绑定)上传递Gremlin查询中的多个语句,而不是发送多个请求。用分号分隔Gremlin查询中的语句

l=[4200, 4355, 4676]; v=graph.vertices(4100).next(); l.each { v.addEdge("knows", graph.vertices(it).next()) }

使用最新的修补程序。您可以执行以下操作:

创建一个示例图:

gremlin> graph = TinkerGraph.open();
gremlin> graph.addVertex("User").property("id", 4100);
==>vp[id->4100]
gremlin> graph.addVertex("Song").property("id", 4200);
==>vp[id->4200]
gremlin> graph.addVertex("Song").property("id", 4355);
==>vp[id->4355]
gremlin> graph.addVertex("Song").property("id", 4676);
==>vp[id->4676]
现在在单个遍历中添加边:

gremlin> graph.traversal().V().hasLabel("User").as("a").
         V().hasLabel("Song").
         addE("edge to song").from("a");
==>e[8][0-edge to song->2]
==>e[9][0-edge to song->4]
==>e[10][0-edge to song->6]

显示了在遍历中使用
addE
作为副作用的另一个示例。

使用最新的修补程序。您可以执行以下操作:

创建一个示例图:

gremlin> graph = TinkerGraph.open();
gremlin> graph.addVertex("User").property("id", 4100);
==>vp[id->4100]
gremlin> graph.addVertex("Song").property("id", 4200);
==>vp[id->4200]
gremlin> graph.addVertex("Song").property("id", 4355);
==>vp[id->4355]
gremlin> graph.addVertex("Song").property("id", 4676);
==>vp[id->4676]
现在在单个遍历中添加边:

gremlin> graph.traversal().V().hasLabel("User").as("a").
         V().hasLabel("Song").
         addE("edge to song").from("a");
==>e[8][0-edge to song->2]
==>e[9][0-edge to song->4]
==>e[10][0-edge to song->6]
显示了在遍历中使用
addE
作为副作用的另一个示例。

试试这个

gremlin> songs = g.V().has("album","albumname")).toList();user = g.V().has('fullName','arunkumar').next(); songs.each{user.addEdge("in",it)} 

gremlin> g.E() //check the edge
希望这有帮助:)

试试这个

gremlin> songs = g.V().has("album","albumname")).toList();user = g.V().has('fullName','arunkumar').next(); songs.each{user.addEdge("in",it)} 

gremlin> g.E() //check the edge

希望这有帮助:)

我也有类似的问题。使用C#SDK,我可以这样做:

g.V('4100')
.addE('knows').to(g.V('4200')).outV()
.addE('knows').to(g.V('4355')).outV()
.addE('knows').to(g.V('4676'))

我也有类似的问题。使用C#SDK,我可以这样做:

g.V('4100')
.addE('knows').to(g.V('4200')).outV()
.addE('knows').to(g.V('4355')).outV()
.addE('knows').to(g.V('4676'))

我认为这种方法不适用于
3.0.1
,因为第二个
V()
在该版本中不受支持,我认为它只在
3.1.x
之后才受支持。如果您一直使用
3.0.1
,我想您需要进行两次遍历。一个用于获取ID,另一个用于构建边缘,正如Jason在另一个答案中所建议的那样。我认为这种方法不适用于
3.0.1
,因为第二个
V()
在该版本中不受支持,我认为它仅从
3.1.x
开始受到支持。如果您一直使用
3.0.1
,我想您需要进行两次遍历。一个用来获取ID,另一个用来构建边缘,正如Jason在另一个答案中所建议的。上面的查询不起作用,你能为gremlin 3.0.1建议吗?我忘记了
next()
调用。更新了我的答案。按id查找顶点应比索引查找快。从你的问题中不清楚你所说的ID是实际的顶点ID还是其他一些索引属性(其他答案都是假设的)。我假设“它”是一个保留字。很难在谷歌上搜索“it”。有人能给我指出一些关于使用each的文档的方向吗?“it”
it
each
闭包的隐式参数。这些都是Groovy语言结构
每个
都用于
是当前元素的位置。上面的查询不起作用,你能为gremlin 3.0.1I提供建议吗?我忘记了
下一步()
调用。更新了我的答案。按id查找顶点应比索引查找快。从你的问题中不清楚你所说的ID是实际的顶点ID还是其他一些索引属性(其他答案都是假设的)。我假设“它”是一个保留字。很难在谷歌上搜索“it”。有人能给我指出一些关于使用each的文档的方向吗?“it”
it
each
闭包的隐式参数。这些都是Groovy语言结构
每个
都是用于
是当前元素的位置。这将起作用,但不仅仅是一个小精灵查询。更改为单个查询:)抱歉,但将其放在同一行不会使其成为单个查询。例如,
songs=g.V().has(“唱片集”、“唱片名”).toList()这是一个查询
user=g.V().has('fullName','arunkumar')。next()这是第二个。事实上,在这种情况下,您正在进行3次遍历,这是低效的。这将起作用,但不仅仅是一个gremlin查询。更改为single query:)很抱歉,将其放在同一行不会使其成为单个查询。例如,
songs=g.V().has(“唱片集”、“唱片名”).toList()这是一个查询
user=g.V().has('fullName','arunkumar')。next()这是第二个。事实上,在这种情况下,您正在进行3次遍历,这是低效的。