更新灯泡中边缘的正确方法(neo4j 或 titan)

2024-01-04

我正在尝试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。到目前为止,我的尝试最终是重新创建了数十种“詹姆斯认识朱莉”的关系,而不是访问现有的关系进行更新。

有人能指出我正确的方向吗?


您可以添加/更新边的属性,但对于图形数据库,您无法更新使其成为边的属性,即您无法更新其传入和传出顶点 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 回溯模式...

  • https://github.com/tinkerpop/gremlin/wiki https://github.com/tinkerpop/gremlin/wiki
  • https://github.com/tinkerpop/gremlin/wiki/Backtrack-Pattern https://github.com/tinkerpop/gremlin/wiki/Backtrack-Pattern
  • http://bulbflow.com/docs/api/bulbs/gremlin/ http://bulbflow.com/docs/api/bulbs/gremlin/
  • http://bulbflow.com/docs/api/bulbs/rexster/gremlin/ http://bulbflow.com/docs/api/bulbs/rexster/gremlin/

但是,当您不知道边缘的 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'

See https://github.com/tinkerpop/gremlin/wiki/Updating-a-Graph https://github.com/tinkerpop/gremlin/wiki/Updating-a-Graph

为了提高可读性,我不会在 Python REPL 中编写 Gremlin oneliner,而是将 Gremlin 脚本放在gremlin.groovy文件,如下所示:

http://bulbflow.com/docs/api/bulbs/groovy/ http://bulbflow.com/docs/api/bulbs/groovy/

以下是使用 Gremlin 获取或创建边缘的现实示例:

https://github.com/espeed/lightbulb/blob/master/lightbulb/gremlin.groovy#L88 https://github.com/espeed/lightbulb/blob/master/lightbulb/gremlin.groovy#L88

代码的详细解释在这里:

Neo4j 的灯泡框架中是否有相当于 commit 的功能 https://stackoverflow.com/questions/16759606/is-there-a-equivalent-to-commit-in-bulbs-framework-for-neo4j/16764036#16764036

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新灯泡中边缘的正确方法(neo4j 或 titan) 的相关文章

随机推荐