【问题标题】:Nested traversal gremlin query for Titan dbTitan db的嵌套遍历gremlin查询
【发布时间】:2016-08-08 05:41:05
【问题描述】:

我想知道如何有一个以嵌套格式返回结果的 gremlin 查询。假设有如下属性图:

USERPAGE 具有一些属性的顶点,例如AGE for USER 顶点;

FOLLOWUSERPAGE 之间的边缘;

我正在寻找一个有效的查询,它可以为所有年龄超过 20 岁的用户以及这些用户所关注的所有页面提供信息。我可以使用应用程序端的一个简单循环来做到这一点,并且每次迭代都使用一个简单的遍历查询。不幸的是,这种解决方案对我来说效率不高,因为它会产生大量查询,并且在这种情况下网络延迟可能会很大。

【问题讨论】:

    标签: graph-databases titan gremlin tinkerpop3


    【解决方案1】:

    这很容易:

    g.V().label('user').has('age',gt(20))
    .match(__.as('user').out('follows').as('page'))
    .select('user','page')
    

    请注意,当您在 gremlin 中使用此查询时,gremlin 会为您提供空指针异常,您可以在代码中使用它并检查“页面”是否存在。

    【讨论】:

      【解决方案2】:

      不确定您对“高效”的定义是什么,但请记住,这是一个典型的 OLAP 用例,您不应期望快速 OLTP 实时响应。

      也就是说,查询应该很简单:

      g.V().has("USER", "AGE", gt(20)).as("user").
        map(out("FOLLOW").fold()).as("pages").
        select("user", "pages")
      

      一个使用现代样本图的小例子:

      gremlin> g = TinkerFactory.createModern().traversal().withComputer()
      ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], graphcomputer]
      gremlin> g.V().has("person", "age", gt(30)).as("user").
                 map(out("created").fold()).as("projects").
                 select("user","projects")
      ==>[user:v[6], projects:[v[3]]]
      ==>[user:v[4], projects:[v[5], v[3]]]
      

      【讨论】:

      • 多么完美的答案!但问题是,当一个用户关注许多用户时,所有这些用户都会加载到内存中
      • @pinokio 可能在这种情况下使用 limit() 可能是一个解决方案。
      • @Daniel Kuppitz 如何获取用户/项目的某些数据(例如用户名、姓氏等)?
      • 您可以选择不同的结果结构:g.V().has("person", "age", gt(30)).as("u").valueMap("name","age").as("user").select("u").out("created").valueMap("name","lang").group().by(select("user"))