首页 文章

Gremlin让边缘共享相同的顶点

提问于
浏览
1

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

  • 顶点类型

  • #1中顶点的传出边的标签

  • #2中来自边的传入顶点的名称

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

  • 人 - >创建 - >任何

  • 人 - >知道 - > vadas

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

  • marko - > created - > lop

  • marko - > knows - > vadas

而以下两个过滤器:

  • 人 - >任何 - > josh

  • person - > created - > lop

应评估以下边缘:

  • marko - >知道 - > josh

  • marko - > created - > lop

我得到的结果与上述期望结果最接近的结果是:

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

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

1 回答

  • 0

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

    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]
    

相关问题