【问题标题】:What's the right approach to "join" two nodes of a graph in gremlin?在 gremlin 中“连接”图形的两个节点的正确方法是什么?
【发布时间】:2020-02-28 06:10:58
【问题描述】:

假设我有一个如下图所示

graph = TinkerGraph.open()
g = graph.traversal()
v1 = g.addV('CC').property('name','t1')
v2 = g.addV('KK').property('name','t1')

我想找到与KK 具有相同'name' 的所有CC。我会写:

g.V().hasLabel('CC').as('c').values('name').as('cn').V().hasLabel('KK').values('name').as('k').where('cn',eq('k')).select('c')

这模仿了 SQL 中的连接,但编写起来所以性能似乎很差。从SQL2Gremlin 开始,如果两个节点之间有一条边连接,他们就有“加入”两个节点的例子。我想知道 gremlin 中是否有任何连接方法,是否有一条连接两个节点的路径事先是未知的?换句话说,在 gremlin 中编写“join”的最佳方法是什么,我们不知道这两个节点是直接连接还是通过路径连接?

非常感谢!

【问题讨论】:

    标签: gremlin


    【解决方案1】:

    你的直觉大体上是对的。 “连接”是两个顶点之间实现的关系(即边)。这通常是图形数据库中的收益。在 SQL 样式中对属性进行顶点到顶点连接通常不会对图有效。

    至于您的查询,您可以将其重新写入此表单以更清晰:

    gremlin> g.V().hasLabel('CC').as('c').
    ......1>   V().hasLabel('KK').
    ......2>   where(eq('c')).
    ......3>     by('name').
    ......4>   select('c')
    ==>v[0]
    

    但是性能可能会保持不变,因为我认为目前没有任何图形系统会优化这种遍历。将不使用索引,您将获得“CC”和“KK”的完整图形扫描以获得结果。显然,这在大图上非常昂贵。

    Gremlin 用户邮件列表here 中对此主题进行了一些讨论,其中提出了一些很好的观点。值得注意的是,乔什·佩里曼(Josh Perryman)写道(除其他优点外):

    SQL 样式的连接是对图形数据库引擎的非常糟糕的使用。喜欢 Daniel 建议应该预先计算连接并在 写时间/数据我开​​玩笑的时间。

    这是必然和设计的。边缘基本物化 加入。图形数据库针对它们进行了优化,磁盘或缓存读取 手术。关系数据库针对连接、查询时间进行了优化 电脑操作。

    预先计算边缘通常要便宜得多 在加载数据之前分离引擎而不是在加载数据之后这样做 进入图表。例外情况是确定边缘时 基于通过图的多跳路径。对于该用例,图表 分贝最好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2012-02-18
      • 2014-07-04
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多