如何使用gremlin python在gremlin服务器上提交更改 - python

我正在编写脚本,使用gremlin-python库在gremlin服务器上创建图形。我找不到该库的任何好的文档。

这是我正在尝试的代码结构:

from    gremlin_python                                  import statics
from    gremlin_python.structure.graph                  import Graph
from    gremlin_python.process.graph_traversal          import __
from    gremlin_python.process.strategies               import *
from    gremlin_python.driver.driver_remote_connection  import DriverRemoteConnection

graph = Graph()

g = graph.traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','try1'))

# Drop all vertices in the graph to create a new one
g.V().drop().iterate()

a = g.addV('person').property('name', 'Tushar').property('pronoun', 'me')
b = g.addV('person').property('name', 'Avi').property('pronoun','you')

e1 = a.addE('knows').to(b).property('relation','self')

c = g.addV('subject').property('name','maths')

e2 = a.addE('studies').to(c)

e3 = b.addE('studies').to(c)
e3.next()

v = g.V().toList()
e = g.E().toList()

print(v)
print(e)

这段代码只给我2个顶点和1个边。

我的一些尝试:

当我尝试不带.next()的代码时,没有数据提交到图形上。
当我给e1一个.next()时,将创建2个不同的顶点和1个不同的边
当我将.next()添加到e2e1时,抛出错误,提示StopIteration
.next()添加到e3e1时,得到4个顶点和2个边

我的图应具有3个顶点和3个节点。我真正想要的是提交由脚本在图形上所做的更改。

一些其他信息:

我以graphson格式存储图
我正在使用Python3.6

参考方案

您需要iterate your traversals。换句话说,当您进行这种分配时:

a = g.addV('person').property('name', 'Tushar').property('pronoun', 'me') 

没有任何内容发送到服务器,并且“ a”不包含您的新顶点。您只需将Traversal实例分配给“ a”-参见下面Groovy中的演示:

gremlin> t = g.addV('person').property('name','tushar').property('pronoun','me');[]
gremlin> t.class
==>class org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal
gremlin> a = t.next()
==>v[0]
gremlin> a.class
==>class org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex

因此,这导致了下一个问题。您以为“ a”是要对其调用VertexaddE()对象,但是我们已经确定“ a”实际上是Traversal。首先,Vertex没有addE()方法,因此即使该方法是Vertex,也无法使用。其次,由于您有一个具有Traversal方法的addE()对象,因此最终出现了Groovy中演示的这种情况:

gremlin> a = g.addV('person').property('name', 'Tushar').property('pronoun', 'me');[]
gremlin> b = g.addV('person').property('name', 'Avi').property('pronoun','you');[]
gremlin> 
gremlin> e1 = a.addE('knows').to(b).property('relation','self');[]
gremlin> e1.toString()
==>[AddVertexStartStep({pronoun=[me], label=[person], name=[Tushar]}), AddEdgeStep({label=[knows], ~to=[[AddVertexStartStep({pronoun=[you], label=[person], name=[Avi]})]], relation=[self]})]
gremlin> 
gremlin> c = g.addV('subject').property('name','maths');[]
gremlin> 
gremlin> e2 = a.addE('studies').to(c);[]
gremlin> e2.toString()
==>[AddVertexStartStep({pronoun=[me], label=[person], name=[Tushar]}), AddEdgeStep({label=[knows], ~to=[[AddVertexStartStep({pronoun=[you], label=[person], name=[Avi]})]], relation=[self]}), AddEdgeStep({label=[studies], ~to=[[AddVertexStartStep({label=[subject], name=[maths]})]]})]
gremlin> 
gremlin> e3 = b.addE('studies').to(c);[]
gremlin> e3.toString()
==>[AddVertexStartStep({pronoun=[you], label=[person], name=[Avi]}), AddEdgeStep({label=[studies], ~to=[[AddVertexStartStep({label=[subject], name=[maths]})]]})]
gremlin> e3.next()
==>e[8][3-studies->6]
gremlin> g.E()
==>e[8][3-studies->6]

注意我做toString()的行。再次说明,您没有期望的结果,而是Traversal。在这些toString()遍历中的每一个中,您都可以看到您实际上只是构建了一个更复杂的遍历,将一个嵌入到另一个遍历中。详细介绍第一个:

gremlin> a = g.addV('person').property('name', 'Tushar').property('pronoun', 'me');[]
gremlin> b = g.addV('person').property('name', 'Avi').property('pronoun','you');[]
gremlin> e1 = a.addE('knows').to(b).property('relation','self');[]
gremlin> e1.toString()
==>[AddVertexStartStep({pronoun=[me], label=[person], name=[Tushar]}), AddEdgeStep({label=[knows], ~to=[[AddVertexStartStep({pronoun=[you], label=[person], name=[Avi]})]], relation=[self]})]

因此,使用这些代码行,您基本上构成了遍历:

g.addV('person').property('name', 'Tushar').property('pronoun', 'me').
  addE('knows').to(addV('person').
                   property('name', 'Avi').
                   property('pronoun','you')).property('relation','self')

然后,永远不会迭代“ e1”,因此永远不会添加数据。您的代码应进行如下更改以使其起作用:

from    gremlin_python                                  import statics
from    gremlin_python.structure.graph                  import Graph
from    gremlin_python.process.graph_traversal          import __
from    gremlin_python.process.strategies               import *
from    gremlin_python.driver.driver_remote_connection  import DriverRemoteConnection

graph = Graph()

g = graph.traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','try1'))

# Drop all vertices in the graph to create a new one
g.V().drop().iterate()

a = g.addV('person').property('name', 'Tushar').property('pronoun', 'me').next()
b = g.addV('person').property('name', 'Avi').property('pronoun','you').next()
g.addE('knows').from_(a).to(b).property('relation','self').iterate()

c = g.addV('subject').property('name','maths').next()

e2 = g.addE('studies').from_(a).to(c).next()

e3 = g.addE('studies').from_(b).to(c).next()

v = g.V().toList()
e = g.E().toList()

print(v)
print(e)

我相信上述语法仅适用于最新版本的TinkerPop。就个人而言,我希望上面的文字写成:

gremlin> g.addV('person').property('name', 'Tushar').property('pronoun', 'me').as('a').
......1>   addV('person').property('name', 'Avi').property('pronoun','you').as('b').
......2>   addV('subject').property('name','maths').as('c').
......3>   addE('knows').from_('a').to('b').property('relation','self').
......4>   addE('studies').from_('a').to('c').
......5>   addE('studies').from_('a').to('c').iterate()
gremlin> g.E()
==>e[23][15-knows->18]
==>e[24][15-studies->21]
==>e[25][15-studies->21]

这样,遍历将被发送到服务器一次,并在单个请求中生成所有数据。

最后,关于:

我找不到该库的任何好的文档。

您会注意到,我在基于Groovy的Gremlin Console中演示了您的代码。这是剪裁/粘贴贴合。这样,Gremlin上的任何文档以及很多文档都将对您有所帮助。请不要因您遇到的示例大多在Groovy中而分心。唯一的区别是特定于语言的语法(例如Java没有单引号来表示字符串,Python的一些步骤与Python中的保留字冲突,因此它们的下划线固定在not_后面)。基本上,无论您选择使用哪种语言,Gremlin都是Gremlin -只要学习语法上的细微差别,它就会变得更容易。综上所述,我们希望将更多文档翻译成具有特定于语言的语法-如果您有兴趣遵循此说明,请观看。

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

如何用'-'解析字符串到节点js本地脚本? - python

我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…