【问题标题】:Proper way to update Edges in Bulbs (neo4j or titan)更新灯泡边缘的正确方法(neo4j 或 titan)
【发布时间】:2013-08-19 22:46:13
【问题描述】:

我正在尝试使用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。到目前为止,我的尝试以重建数十个“詹姆斯知道朱莉”的关系而告终,而不是访问现有的关系来更新。

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

【问题讨论】:

    标签: neo4j titan bulbs


    【解决方案1】:

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

    但是,当您不知道其 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 one 衬里,而是将我的 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

    【讨论】:

    • 谢谢。看起来 neo4j 在较新的版本中引入了 g.edges.get_or_create 。不确定其他服务器是否在关注。我将不得不玩弄你的方法。我们正在将一些 RDBMS 系统转换为 Graphs,并且有很多批处理工作,我们可能已经创建了一条边并想要更新它 - 而不是用较少的数据重新创建它。
    • 对于批量更新,通常使用 Redis 或内存中 Java/Groovy 属性映射到顶点/边 ID。根据您预处理数据的方式,使用 Python 中的 Redis 可能有意义,但通过 jedis 客户端使用 Java 中的 Redis 可能更有效。请参阅几年前我的 Gremlin 用户组帖子:“让 Gremlin 在 Redis 浏览图表时实时与 Redis 对话”(groups.google.com/d/topic/gremlin-users/xhqP-0wIg5s/discussion)——您可能需要更新代码以使用最新的 Gremlin 版本.
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2012-10-29
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2013-11-03
    相关资源
    最近更新 更多