【问题标题】:How to create a bidirectional edge between two vertices using gremlin?如何使用 gremlin 在两个顶点之间创建双向边?
【发布时间】:2017-04-03 15:26:03
【问题描述】:

使用 gremlin 在两个顶点之间创建双向边的最佳方法是什么?是否有直接添加边的命令,或者我们应该添加两条边,如顶点 X -> 顶点 Y 和顶点 Y -> 顶点 X?

【问题讨论】:

    标签: graph gremlin


    【解决方案1】:

    您可以在两个顶点之间添加一条边,然后使用both() 步骤在查询时忽略方向。这就是您通常在 Gremlin 中处理双向边缘的方式。

    让我们打开 Gremlin 控制台并创建一个简单的图表,其中 Alice 和 Bob 是朋友:

             \,,,/
             (o o)
    -----oOOo-(3)-oOOo-----
    gremlin> graph = TinkerGraph.open()
    gremlin> g = graph.traversal(standard())
    ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
    gremlin> 
    ==>null
    gremlin> g.addV(label, 'user', 'name', 'Alice').as('alice').addV(label, 'user', 'name', 'Bob').as('bob').addE('friendWith').from('alice').to('bob')
    ==>e[4][0-friendWith->2]
    

    这将创建一个具有两个顶点和一个边的图:

    gremlin> g.V()
    ==>v[0]
    ==>v[2]
    gremlin> g.E()
    ==>e[4][0-friendWith->2]
    

    请注意,您无法在传出方向上从 Bob 顶点遍历到 Alice 顶点,但可以在传入方向上遍历(第一次查询没有结果)。

    gremlin> g.V().has('name', 'Bob').out('friendWith')
    gremlin> g.V().has('name', 'Bob').in('friendWith')
    ==>v[0]
    

    或者从 Alice 开始(第二次查询没有结果),你会得到相反的结果:

    gremlin> g.V().has('name', 'Alice').out('friendWith')
    ==>v[2]
    gremlin> g.V().has('name', 'Alice').in('friendWith')
    

    但是,您可以使用both() 步骤在两个方向上遍历图形,并检索 Alice 的朋友或 Bob 的朋友。

    gremlin> g.V().has('name', 'Alice').both('friendWith')
    ==>v[2]
    gremlin> g.V().has('name', 'Bob').both('friendWith')
    ==>v[0]
    

    这也适用于具有两个以上顶点和一个友谊关系的更复杂的图。 both() 步骤在尝试遍历相邻顶点时只是忽略了边的方向。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2019-07-27
      • 2015-02-27
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多