Я думаю, что следую за вашей проблемой, и я не думаю, что у меня есть хороший ответ для вас. На данный момент Gremlin не очень хорош в обнаружении типов, и проблема остается открытой на TINKERPOP-2234 . Типичный обходной путь для большинства людей, когда они имеют смешанный набор элементов в потоке, состоит в том, чтобы использовать шаг, подобный coalesce()
или choose()
, чтобы действовать как форму оператора switch
, а затем найти некоторый фильтр, который может идентифицировать тип объекта. Итак, вот несколько смешанных результатов, которые я придумал:
gremlin> g.V().union(outE(),__.in())
==>e[9][1-created->3]
==>e[7][1-knows->2]
==>e[8][1-knows->4]
==>v[1]
==>v[1]
==>v[4]
==>v[6]
==>e[10][4-created->5]
==>e[11][4-created->3]
==>v[1]
==>v[4]
==>e[12][6-created->3]
, а затем я проверяю с помощью hasLabel()
для меток, которые, как я знаю, принадлежат только вершинам, тогда все остальное должно быть ребром:
gremlin> g.V().union(outE(),__.in()).choose(hasLabel('person','software'), values('name'), values('weight'))
==>0.4
==>0.5
==>1.0
==>marko
==>marko
==>josh
==>peter
==>1.0
==>0.4
==>marko
==>josh
==>0.2
Не идеально, очевидно, но обычно он решает проблемы большинства людей. Надеемся, что мы увидим решение TINKERPOP-2234 для 3.5.0.
Другой возможный обходной путь - это использование лямбда, который хорошо работает в некоторых случаях, хотя мы стараемся по возможности избегать их:
gremlin> g.V().union(outE(),__.in()).choose(filter{it.get() instanceof Vertex}, values('name'), values('weight'))
==>0.4
==>0.5
==>1.0
==>marko
==>marko
==>josh
==>peter
==>1.0
==>0.4
==>marko
==>josh
==>0.2