titan - 如何使用 Gremlin/Titan/TinkerPop3 更新特定的边属性?

标签 titan gremlin tinkerpop3

目标
我有一个足够简单的任务需要完成:设置特定边属性的权重。以这个场景为例:
Example Graph Structure
我想做的是更新 weight 的值.
附加要求

  • 如果边不存在,则应创建它。
  • 两个节点之间最多只能存在一条相同类型的边(即,Joey 和 Pizza 之间不能有多个 type“eat”的“votes_for”边。
  • 该任务应该使用 Java API of Titan 解决(其中包括 Gremlin 作为 TinkerPop 3 的一部分)。

  • 我知道的
    我有以下信息:
  • Vertex标记为“用户”
  • 边缘标签votes_for
  • 边属性值type (在这种情况下,“吃”)
  • 房产值(value)name标记为“meal”(在本例中为“pizza”)的顶点,因此还有它的 Vertex .

  • 我想到的
    我想我需要做如下事情:
  • 从 Joey 顶点开始
  • 找到所有标记为 votes_for 的出边(最多应为 1)有 type “吃”和标记为“餐”的传出顶点具有 name “比萨”。
  • 更新 weight边的值。

  • 这是我在代码中搞砸的:
    //vertex is Joey in this case
    g.V(vertex.id())
        .outE("votes_for")
        .has("type", "eat")
        //... how do I filter by .outV so that I can check for "pizza"?
        .property(Cardinality.single, "weight", 0.99);
        //... what do I do when the edge doesn't exist?
    
    正如代码中所评论的那样,仍然存在问题。明确指定 Titan 模式有帮助吗?是否有任何我不知道的帮助程序/实用程序方法?有几个vote_for更有意义吗?标签而不是一个标签 + type属性,如 vote_for_eat ?
    谢谢你的帮助!

    最佳答案

    你走在正确的轨道上。查看 vertex steps documentation .

    标记边缘,然后从边缘遍历到顶点进行检查,然后跳回边缘更新属性。

    g.V(vertex.id()).
      outE("votes_for").has("type", "eat").as("e").
      inV().has("name", "pizza").
      select("e").property("weight", 0.99d).
      iterate()
    

    完整的 Gremlin 控制台 session :
    gremlin> Titan.version()
    ==>1.0.0
    gremlin> Gremlin.version()
    ==>3.0.1-incubating
    gremlin> graph = TitanFactory.open('inmemory'); g = graph.traversal()
    ==>graphtraversalsource[standardtitangraph[inmemory:[127.0.0.1]], standard]
    gremlin> vertex = graph.addVertex(T.label, 'user', 'given_name', 'Joey', 'family_name', 'Tribbiani')
    ==>v[4200]
    gremlin> pizza = graph.addVertex(T.label, 'meal', 'name', 'pizza')
    ==>v[4104]
    gremlin> votes = vertex.addEdge('votes_for', pizza, 'type', 'eat', 'weight', 0.8d)
    ==>e[1zh-38o-4r9-360][4200-votes_for->4104]
    gremlin> g.E(votes).valueMap(true)
    ==>[label:votes_for, weight:0.8, id:2rx-38o-4r9-360, type:eat]
    gremlin> g.V(vertex.id()).outE('votes_for').has('type','eat').as('e').inV().has('name','pizza').select('e').property('weight', 0.99d).iterate(); g.E(votes).valueMap(true)
    ==>[label:votes_for, weight:0.99, id:2rx-38o-4r9-360, type:eat]
    

    明确指定 Titan 模式有帮助吗?

    如果您想从 Joey 开始没有引用 vertex 的节点或其 id ,这将是 Titan composite index 的一个很好的用例.遍历将从以下开始:
    g.V().has("given_name", "Joey")
    

    是否有任何我不知道的帮助程序/实用程序方法?

    除了TinkerPop reference documentation ,您可以阅读以下几个教程:
  • Getting Started
  • The Gremlin Console
  • Recipes

  • 使用多个 vote_for 标签而不是一个标签 + 类型属性(例如vote_for_eat)是否更有意义?

    取决于您的图形模型或查询模式是什么,但更精细的标签如 vote_for_eat可以很好地工作。您可以在遍历步骤中传递多个边标签:
    g.V(vertex.id()).outE('vote_for_eat', 'vote_for_play', 'vote_for_sleep')
    

    更新

    两个节点之间最多只能存在一条相同类型的边

    你可以使用 Titan 模式来帮助解决这个问题,特别是定义一个 edge label with multiplicity ONE2ONE .如果创建多个 votes_for_eat 会抛出异常之间Joeypizza .

    关于titan - 如何使用 Gremlin/Titan/TinkerPop3 更新特定的边属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40746954/

    相关文章:

    solr - Janus Graph HBase 和 Solr 未知外部索引后端 : jgex

    azure - Gremlin Graph API 查询日志记录

    java - Tinkerpop3 自定义边缘 id 生成器

    gremlin - 根据从不同边缘的属性中导出的信息过滤边缘

    graph - 泰坦 : Gremlin query returns inconsistent results on repeated execution

    c# - 如何从 C#.Net 代码创建 Gremlin 图?

    titan - 通过 has Step 检索图中信息的最佳方法是什么

    python - gremlin python 检索 id 和标签 (valueMap(True))

    java - 通过java执行复杂的Titan查询

    scala - 在 titan + cassandra DB 中使用 gremlin scala 更新边缘属性值