Соединение вершин с косвенным типом
Я хочу сделать соединение между двумя типами вершин, используя 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"?
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]