如何使用 gremlin python 在 gremlin 服务器上提交更改
how to commit changes on gremlin server using gremlin python
我正在编写脚本以使用 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
一个 .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" 是一个 Vertex
对象,您希望对其调用 addE()
,但我们已经确定 "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]
这样,您的遍历将被发送到服务器一次,并在一个请求中生成所有数据。
最后,关于:
I could not find any good documentation for the library.
您会注意到我在基于 Groovy 的 Gremlin 控制台中演示了您的代码。这是 cut/paste 合身。这样,有关 Gremlin 的任何文档(还有很多)都会对您有所帮助。请不要因为您遇到的示例大多在 Groovy 中而分心。唯一的区别是特定于语言的语法(例如 Java 没有单引号来表示字符串,Python 有几个步骤与 Python 中的保留字冲突,因此它们有一个固定的下划线到最后像 not_
)。基本上,无论您选择使用哪种语言,Gremlin 都是 Gremlin - 只需了解语法上的细微差别,它就会变得更容易。综上所述,我们希望翻译更多的文档以具有特定于语言的语法 - 如果您有兴趣了解,可以观看此 GitHub issue。
我正在编写脚本以使用 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
一个.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" 是一个 Vertex
对象,您希望对其调用 addE()
,但我们已经确定 "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]
这样,您的遍历将被发送到服务器一次,并在一个请求中生成所有数据。
最后,关于:
I could not find any good documentation for the library.
您会注意到我在基于 Groovy 的 Gremlin 控制台中演示了您的代码。这是 cut/paste 合身。这样,有关 Gremlin 的任何文档(还有很多)都会对您有所帮助。请不要因为您遇到的示例大多在 Groovy 中而分心。唯一的区别是特定于语言的语法(例如 Java 没有单引号来表示字符串,Python 有几个步骤与 Python 中的保留字冲突,因此它们有一个固定的下划线到最后像 not_
)。基本上,无论您选择使用哪种语言,Gremlin 都是 Gremlin - 只需了解语法上的细微差别,它就会变得更容易。综上所述,我们希望翻译更多的文档以具有特定于语言的语法 - 如果您有兴趣了解,可以观看此 GitHub issue。