代码之家  ›  专栏  ›  技术社区  ›  Srinath Ganesh

TinkerPop:用于组合和过滤多个遍历的通用查询

  •  2
  • Srinath Ganesh  · 技术社区  · 6 年前

    TinkerPop Modern Graph

    条件:

    1. vadas 连接到 lop 2 hops
    2. 瓦达斯 连接到 peter 在内部 3 hops
    3. 连接到 does-not-exists 在里面 1 hops

    1. 条件 1 以及 2

    2. 条件 1 3 =>[vadas marko lop(瓦达斯马尔科洛普)]


    我能得到的

    1. 以及 2
    gremlin> g.V().has("person", "name", "vadas").as("from")
    .select("from").as("to1").repeat(both().as("to1")).times(2).emit().has("software", "name", "lop")
    .select("from").as("to2").repeat(both().as("to2")).times(3).emit().has("person", "name", "peter")
    .project("a", "b")
    .by(select(all, "to1").unfold().values("name").fold())
    .by(select(all, "to2").unfold().values("name").fold())
    ==>[a:[vadas,marko,lop],b:[vadas,marko,lop,peter]]
    1. 条件 或者 2
    gremlin> g.V().has("person", "name", "vadas").as("nodes")
    .union(repeat(both().as("nodes")).times(2).emit().has("software", "name", "lop"),
    out().has("x", "y", "does-not-exist").as("nodes"))
    .project("a")
    .by(select(all, "nodes").unfold().values("name").fold())
    ==>[a:[vadas,marko,lop]]

    那么如何实现这一点我有两种不同的查询格式,有没有一种方法来编写一个查询格式,可以做到这两个?


    g.V().has("person", "name", "vadas").as("nodes")
    .or(
    repeat(both().as("nodes")).times(2).emit().has("software", "name", "lop"), 
    repeat(both().as("nodes")).times(3).emit().has("person", "name", "peter")
    )
    .project("a").by(select(all, "nodes").unfold().values("name").fold())
    ==>[a:[vadas]]
    // Expect paths to be printed here vadas..lop, vadas...peter
    1 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Kuppitz    6 年前

    我不知道我是否理解你想要什么,但如果你只是需要一个查询模板之类的东西,那么也许这会有所帮助:

    gremlin> conditions = [
    ......1>   [filter: {has("software", "name", "lop")},  distance: 2],
    ......2>   [filter: {has("person", "name", "peter")},  distance: 3],
    ......3>   [filter: {has("x", "y", "does-not-exist")}, distance: 1]]
    ==>[filter:groovysh_evaluate$_run_closure1@378bd86d,distance:2]
    ==>[filter:groovysh_evaluate$_run_closure2@2189e7a7,distance:3]
    ==>[filter:groovysh_evaluate$_run_closure3@69b2f8e5,distance:1]
    
    gremlin> g = TinkerFactory.createModern().traversal()
    ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
    gremlin> g.V().has("person", "name", "vadas").
    ......1>   union(repeat(both().simplePath()).
    ......2>           times(conditions[0].distance).
    ......3>           emit().
    ......4>         filter(conditions[0].filter()).store("x"),
    ......5>         repeat(both().simplePath()).
    ......6>           times(conditions[1].distance).
    ......7>           emit().
    ......8>         filter(conditions[1].filter()).store("x")).
    ......9>   barrier().
    .....10>   filter(select("x").
    .....11>          and(unfold().filter(conditions[0].filter()),
    .....12>              unfold().filter(conditions[1].filter()))).
    .....13>   path().
    .....14>     by("name")
    ==>[vadas,marko,lop]
    ==>[vadas,marko,lop,peter]
    
    gremlin> g.V().has("person", "name", "vadas").
    ......1>   union(repeat(both().simplePath()).
    ......2>           times(conditions[0].distance).
    ......3>           emit().
    ......4>         filter(conditions[0].filter()).store("x"),
    ......5>         repeat(both().simplePath()).
    ......6>           times(conditions[2].distance).
    ......7>           emit().
    ......8>         filter(conditions[2].filter()).store("x")).
    ......9>   barrier().
    .....10>   filter(select("x").
    .....11>          or(unfold().filter(conditions[0].filter()),
    .....12>             unfold().filter(conditions[2].filter()))).
    .....13>   path().
    .....14>     by("name")
    ==>[vadas,marko,lop]
    

    and or

    apply = { condition ->
      repeat(both().simplePath()).
        times(condition.distance).
        emit().
      filter(condition.filter()).store("x")
    }
    
    verify = { condition ->
      unfold().filter(condition.filter())
    }
    
    // condition 1 AND 2   
    g.V().has("person", "name", "vadas").
      union(apply(conditions[0]),
            apply(conditions[1])).
      barrier().
      filter(select("x").
             and(verify(conditions[0]),
                 verify(conditions[1]))).
      path().
        by("name")
    
    // condition 1 OR 3   
    g.V().has("person", "name", "vadas").
      union(apply(conditions[0]),
            apply(conditions[2])).
      barrier().
      filter(select("x").
             or(verify(conditions[0]),
                verify(conditions[2]))).
      path().
        by("name")