Соединение вершин с указанием типа

Я хочу выполнить соединение между двумя типами вершин с помощью gremlin

select * from type1 inner join type2 in type2.id = type1.type2_id

Следующее работает при использовании type1 и type2 в качестве меток вершин:

g.V()
  .hasLabel("type2").as("t2")
  .inE("hasJoin")
  .hasLabel("type1").as("t1")
  .select("t1", "t2")

Однако мой граф не использует метку вершины для представления типа, а вместо этого использует другую вершину, соединенную ребром hasType.

g.V()//
    .addV("instance1").as("instance1")//
    .addV("instance2").as("instance2")//
    .addV("type1").as("type1")//
    .addV("type2").as("type2")//
    .addE("hasType").from("instance1").to("type1")//
    .addE("hasType").from("instance2").to("type2")//
    .addE("hasJoin").from("instance1").to("instance2")//
    .iterate();

Мне нужно было бы сделать что-то вроде замены

hasLabel("type2").as("t2")

с участием

hasLabel("type2").inE("hasType").outV().as("t2"):

что приведет к

g.V()
  .hasLabel("type2").inE("hasType").outV().as("t2")
  .inE("hasJoin")
  .hasLabel("type1").inE("hasType").outV().as("t1")
  .select("t1", "t2")

Это работает для «t2», но не для «t1», поскольку .inE («hasJoin»). HasLabel («type1») просто неверен. Какую функцию мне нужно использовать для соединения «t1» и «t2»?


person Wolfgang Colsman    schedule 09.12.2018    source источник
comment
Не могли бы вы предоставить скрипт Gremlin, который создает некоторые образцы данных - вот пример stackoverflow.com/questions/51388315/   -  person stephen mallette    schedule 10.12.2018
comment
Я обновил вопрос, чтобы предоставить образцы данных   -  person Wolfgang Colsman    schedule 12.12.2018


Ответы (1)


Все, что вам нужно, это фильтр, проверяющий вершину смежного типа. Вот ваш пример графика (ваш скрипт не совсем работает):

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV("instance1").property("name","instance1").as("instance1").
......1>   addV("instance2").property("name","instance2").as("instance2").
......2>   addV("type1").as("type1").
......3>   addV("type2").as("type2").
......4>   addE("hasType").from("instance1").to("type1").
......5>   addE("hasType").from("instance2").to("type2").
......6>   addE("hasJoin").from("instance1").to("instance2").
......7>   iterate()

И запрос, который вы ищете, должен быть примерно таким:

gremlin> g.V().hasLabel("type2").in("hasType").as("t2").
           both("hasJoin").
           filter(out("hasType").hasLabel("type1")).as("t1").
           select("t1", "t2").
             by("name")
==>[t1:instance1,t2:instance2]
person Daniel Kuppitz    schedule 12.12.2018