我正在尝试使用Bulbs
与图形数据库进行交互。 (生产将使用Titan,本地Neo4j似乎最适合进行实验)。
我无法理解这个概念......
灯泡显示如何创建新的顶点...
>>> james = g.vertices.create(name="James")
>>> julie = g.vertices.create(name="Julie")
>>> g.edges.create(james, "knows", julie)
深入研究文档,我可以用“获取或创建”替换它:
>>> james = g.vertices.get_or_create('name',"James",{'name':'james')
我无法弄清楚的是如何获得现有Edge。到目前为止,我的尝试最终重现了几十个“james know julie”关系,而不是访问现有关系进行更新。
有人能指出我正确的方向吗?
答案 0 :(得分:4)
您可以添加/更新边缘的属性,但是对于图形数据库,您无法更新使其成为边缘的属性,即您无法更新其传入和传出顶点ID或标签。而是删除边缘并添加新边缘。
以下是获取和更新其属性的不同方法。
您可以通过其ID获得优势:
>>> from bulbs.rexster import Graph
>>> g = Graph()
>>> james = g.vertices.create(name="James")
>>> julie = g.vertices.create(name="Julie")
>>> edge = g.edges.create(james, "knows", julie)
>>> edge2 = g.edges.get(edge.eid) # get the edge again
>>> assert edge == edge2
>>> edge2.someprop = "somevalue"
>>> edge2.save()
如果它具有任何属性并且它们被编入索引,您可以通过其属性查找边缘:
# will return an iterator or None edges (may return more than one)
>>> edges = g.edges.index.lookup(someprop="somevalue")
>>> edge = edges.next()
>>> edge.someprop = "newvalue"
>>> edge.save()
# will return 1 or None edges (or an error if more than 1 edge found)
>>> edge = g.edges.index.get_unique(someprop="somevalue")
>>> edge.someprop = "newvalue"
>>> edge.save()
您还可以通过遍历顶点来使用Gremlin获得优势:
>>> from bulbs.rexster import Graph
>>> g = Graph()
>>> script = "g.V('name',name1).outE(label).as('e').inV.has('name',name2).back('e')"
>>> params = dict(name1="James", label="knows", name2="Julie")
>>> edges = g.gremlin.query(script, params)
>>> edge = edges.next()
>>> edge.someprop = "newvalue"
>>> edge.save()
参见Gremlin Backtrack Pattern ...
但是,当您不知道其ID时更新边缘的最有效方法是通过查找它的Gremlin脚本更新边缘(这样您只需要往返服务器一次,而不是两次):
>>> from bulbs.rexster import Graph
>>> g = Graph()
>>> script = "g.V('name',name1).outE(label).as('e').inV.has('name',name2).back('e').sideEffect{it.someprop = someprop}"
>>> params = dict(name1="James", label="knows", name2="Julie", someprop="somevalue")
>>> edges = g.gremlin.query(script, params)
>>> edge = edges.next()
>>> edge.someprop
'somevalue'
请参阅https://github.com/tinkerpop/gremlin/wiki/Updating-a-Graph
为了便于阅读,我不是在Python REPL中编写Gremlin一个衬里,而是将我的Gremlin脚本放在gremlin.groovy
文件中,如下所示:
http://bulbflow.com/docs/api/bulbs/groovy/
以下是使用Gremlin获取或创建边缘的真实示例:
https://github.com/espeed/lightbulb/blob/master/lightbulb/gremlin.groovy#L88
代码的详细说明如下:
Is there a equivalent to commit in bulbs framework for neo4j