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

2024-06-28 20:28:44 发布

您现在位置: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

Tags: to代码namefromimport图形propertygraph
1条回答
网友
1楼 · 发布于 2024-06-28 20:28:44

你需要iterate your traversals。换言之,当你做这种任务时:

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

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

^{pr2}$

所以,这就引出了下一个问题。您认为“a”是一个Vertex对象,您想为其调用addE(),但我们已经确定“a”实际上是一个Traversal。首先,Vertex没有addE()方法,因此即使是Vertex这种方法也不起作用。第二,因为您有一个Traversal对象,它确实有一个addE()方法,所以您将在Groovy中演示这种情况:

^{3}$

请注意我执行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]

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

最后,关于:

I could not find any good documentation for the library.

您会注意到,我在基于Groovy的Gremlin控制台中演示了您的代码。这是一个剪切/粘贴适合。这样一来,任何关于Gremlin的文档都会对您有所帮助,而且有很多。请不要因为您遇到的示例大多是Groovy而分心。唯一的区别是特定于语言的语法(例如Java没有单引号来表示字符串,Python有一些步骤与Python中的保留字冲突,因此它们的末尾有一个下划线,比如not_)。基本上,无论你选择使用什么语言,Gremlin都是Gremlin,只要学习语法上的细微差别,它就会变得更容易。尽管如此,我们希望将更多的文档翻译成特定于语言的语法-如果您对下面的内容感兴趣,可以看一下这个GitHub issue。在

相关问题 更多 >