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

我正在编写一个脚本,使用gremlin-python库在gremlin-server上创建一个图形.我找不到任何关于图书馆的好文档.

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

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 a .next()时,会创建2个不同的顶点和1个不同的边
>当我将.next()添加到e2和e1时,会抛出一个错误说StopIteration
>当我将.next()添加到e3和e1时,我得到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”是您要为其调用addE()的Vertex对象,但我们已经确定“a”实际上是遍历.首先,Vertex没有addE()方法,所以即使这是Vertex,这种方法也行不通.其次,因为你有一个具有addE()方法的Traversal对象,所以你最终会遇到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()的行.同样,你没有像你期望的那样得到结果,而是一个遍历.在每个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]

通过这种方式,您的遍历将被发送到服务器一次,并在单个请求中生成所有数据.

最后,关于:

I could not find any good documentation for the library.

您将注意到我在Gremlin控制台中演示了您的代码,该控制台基于Groovy.它是剪裁/贴合的.通过这种方式,任何有关Gremlin的文档都会对您有所帮助.请注意,您遇到的示例主要是在Groovy中.唯一的区别是语言特定的语法(例如,Java没有单引号来表示字符串,Python有几个步骤与Python中的保留字冲突,因此它们有一个下划线固定到最后,如not_).基本上,Gremlin是您选择使用的任何语言的Gremlin – 只需学习语法的微妙差异,它应该变得更容易.总而言之,我们希望将更多文档翻译成具有语言特定的语法 – 如果您对此有兴趣,可以观看此GitHub issue.

上一篇:gremlin语言语法--学习笔记


下一篇:linux环境下安装可操作图库语言Gremlin的图框架HugeGraph