2014-12-09 3 views
2

У меня есть график, со следующей структурой:Gremlin итерационные условного обход

  1. Некоторых вершины представляют собой реальные элементы и некоторый типа, т.е. существует вершина для «городов» и вершин для конкретных городов, таких как «Лондон »или« Сиэтл ». Каждая вершина может иметь ребро «is-a» в своей вершине типа, то есть "London" -(is-a)-> "city", "USA" -(is-a)-> "country".
  2. Вершины могут быть связаны также «in», т.е. "London" -(in)-> "UK", "Seattle" -(in)->"Washington".
  3. Некоторые вершины также могут иметь отношение «внутри страны», то есть "Seattle"->(in-country)->"USA", но некоторые могут не иметь.
  4. Возможно иметь несколько ссылок (т. Е. Какой-то город может оспариваться между двумя странами и поэтому иметь две ссылки «внутри страны» или «в») - в этом случае следует вернуть несколько стран.

Задача состоит в том, чтобы каждая вершина попыталась найти страну, в которой она проживает (конечно, это бессмысленно для общих вершин типа «город», но в этом случае она должна просто производить нуль). Так что я пытался сделать что-то вроде этого:

v.as('loopstep').ifThenElse{it.out('is-a').has('ID', 'country').hasNext()}{ 
it 
}{ 
it.ifThenElse{it.out('in-country').hasNext()}{ 
    it.out('in-country') 
}{ 
    it.out('in').loop('loopstep'){it.loops < 10 } 
} 
} 

но производит NPE на петле, например .:

java.lang.NullPointerException 
    at com.tinkerpop.pipes.branch.LoopPipe.getLoops(LoopPipe.java:75) 

и т.д. Похоже, что петля не может видеть «loopstep» ярлык. Я делаю это неправильно? Каким будет правильный способ написать такой обходной запрос?

+0

Угадайте, что второй 'ifThenElse' должен начинаться с' it' not 'if'. Некоторый код, который создает граф в соответствии с вашим описанием, будет приятным. – Faber

+0

@Faber да, спасибо, исправлена ​​опечатка – StasM

+0

Я не уверен, что полностью понимаю. во-первых, ваша начальная вершина (т. е. 'v') город? во-вторых, какова точка конструкции цикла, учитывая вашу схему? все городские вершины соединяются со странами через один или несколько краев метки «in» или «in-country» - так где же нужна петля? может быть, я что-то не понимаю о вашей схеме? –

ответ

2

Я не думаю, что вам нужны все ifThenElse. Предполагая, что теперь у меня есть свой модельный право, я думаю, вам просто нужно это:

gremlin> g = new TinkerGraph()                  
==>tinkergraph[vertices:0 edges:0] 
gremlin> g = new TinkerGraph()                  
==>tinkergraph[vertices:0 edges:0] 
gremlin> usa = g.addVertex([name:"USA"]) 
==>v[0] 
gremlin> va = g.addVertex([name:"VA"])  
==>v[1] 
gremlin> fairfax = g.addVertex([name:"Fairfax"]) 
==>v[2] 
gremlin> country = g.addVertex([ID:"country"]) 
==>v[3] 
gremlin> state = g.addVertex([ID:"state"]) 
==>v[4] 
gremlin> city = g.addVertex([ID:"city"]) 
==>v[5] 
gremlin> g.addEdge(null, fairfax, va, "in") 
==>e[6][2-in->1] 
gremlin> g.addEdge(null, fairfax, city, "is-a") 
==>e[7][2-is-a->5] 
gremlin> g.addEdge(null, va, usa, "in")  
==>e[8][1-in->0] 
gremlin> g.addEdge(null, va, state, "is-a") 
==>e[9][1-is-a->4] 
gremlin> g.addEdge(null, fairfax, usa, "in-country") 
==>e[10][2-in-country->0] 
gremlin> g.addEdge(null, usa, country, "is-a") 
==>e[11][0-is-a->3] 
gremlin> fairfax.as('x').out('in','in-country').loop('x'){it.loops<10 && it.object.out('is-a').ID.next()!='country'}.dedup.name 
==>USA 

Комплектование что последняя строка врозь вы получите, траверс из «города» (т.е. Fairfax), используя «в» или «в стране» этикетки. Очевидно, если мне повезет, я поеду на «внутри страны», и я закончу. Затем я возвращаюсь обратно к заполнителю x, делая это, пока у меня все еще есть меньше 10 циклов, и хотя текущая вершина, на которой я нахожусь, не является страной, иначе я выхожу из цикла, потому что я достиг вершины страны I хотите испустить. I dedup, потому что ваша схема позволяет несколько способов добраться до страны с учетом «внутри страны» и «внутри». В зависимости от вашего набора данных вам может понадобиться некоторая обработка ошибок или что-то в этом роде, но я думаю, что это должно вдохновлять вас на решение окончательного решения.

+0

Это выглядит хорошо, за исключением того, что он ничего не возвращает для usa. Но это исправление, спасибо, оно меня на правильном пути. – StasM

 Смежные вопросы

  • Нет связанных вопросов^_^