【问题标题】:Gremlin get edges sharing the same vertexGremlin 获得共享相同顶点的边
【发布时间】:2019-01-06 06:02:59
【问题描述】:

我的应用程序有英文过滤器,我需要将这些过滤器翻译成 Gremlin 查询。每个过滤器由三部分组成:

  1. 顶点类型
  2. #1 中顶点的出边标签
  3. #2 中边缘的传入顶点名称

任何部分都可以采用字符串“any”,这表示结果中可以包含任何类型、标签或名称。 以现代玩具图为例,我有以下两个过滤器:

  1. 人 -> 已创建 -> 任何
  2. 人 -> 知道 -> vadas

以上两个过滤器的评估结果应该是:

  1. marko -> 创建 -> lop
  2. marko -> 知道 -> vadas

而以下两个过滤器:

  1. 人 -> 任何 -> 乔希
  2. 人 -> 创建 -> lop

应该评估到以下边缘:

  1. marko -> 知道 -> josh
  2. marko -> 创建 -> lop

我提出的最接近上述预期结果的查询是:

g.E().and(outV().outE().has(label, "created"), outV().outE().has(label, "knows").inV().has("name", "vadas"), outV().has(label, "person"))

上述查询的问题在于它返回了从 marko 出来的所有三个边,而不仅仅是两个所需的边。如上所述,如何改进我的查询以仅返回两条边?

【问题讨论】:

    标签: java graph neo4j gremlin


    【解决方案1】:

    此解决方案采用将过滤器与返回结果的遍历分开的方法。

    gremlin> Gremlin.version()
    ==>3.3.3
    gremlin> g = TinkerFactory.createModern().traversal()
    ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
    gremlin> g.V().
    ......1>     and(
    ......2>         outE('created'),
    ......3>         out('knows').has('name', 'vadas')
    ......4>     ).
    ......5>     union(
    ......6>         outE('created').inV(),
    ......7>         outE('knows').inV().has('name', 'vadas')
    ......8>     ).
    ......9>     path().by('name').by(label)
    ==>[marko,created,lop]
    ==>[marko,knows,vadas]
    gremlin> g.V().
    ......1>     and(
    ......2>         out().has('name', 'josh'),
    ......3>         out('created').has('name', 'lop')
    ......4>     ).
    ......5>     union(
    ......6>         outE().inV().has('name', 'josh'),
    ......7>         outE('created').inV().has('name', 'lop')
    ......8>     ).
    ......9>     path().by('name').by(label)
    ==>[marko,knows,josh]
    ==>[marko,created,lop]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多