NEO4J/Gremlin/Cypher: Как получить все узлы, пока я не достигнут определенного расстояния (глубины) в карте, подобной настройке?
Вопрос
У меня есть простой график с полями-в каждом полях есть 4 соседи (северо-восток на юг-запад):
@NodeEntity
public class Field {
@GraphId
Long id;
Field north;
Field east;
Field south;
Field west;
//.. other stuff
}
Я настроен график DB (NEO4J), так что все они красивые и связанные (как сетка). Теперь я хочу получить все узлы - от стартового узла - который находится на 5 хмеле.
С классическими проходами это работает нормально и выглядит так:
public Collection<Field> getFieldsWithDepth(Field startField, final int depth) {
Node fieldNode = this.getGraphdb().getNodeById(startField.getId());
Traverser traverser = fieldNode.traverse(Traverser.Order.BREADTH_FIRST, // check direct relations first, then go deeper
new StopEvaluator() {
@Override
public boolean isStopNode(TraversalPosition pos) {
if (pos.depth()==depth)
return true;
else
return false;
}
}, // worst case: go to end of graph
new ReturnableEvaluator() {
@Override
public boolean isReturnableNode(TraversalPosition pos) {
return true;
}
},
Relations.north,
Direction.OUTGOING,
Relations.east,
Direction.OUTGOING,
Relations.west,
Direction.OUTGOING,
Relations.south,
Direction.OUTGOING
);
ArrayList<Field> fields = new ArrayList<Field>();
for (Node node : traverser.getAllNodes())
{
fields.add((Field)this.getGraph().get(node));
}
return fields;
}
Так что, если у меня есть «карта», как это:
1 2 | 3| 4 5
6 |7| | 8| | 9| 10
|11| |12| *13* |14| |15|
16 |17| |18| |19| 20
21 22 |23| 24 25
И я запрашиваюсь с начальным узлом '' 13 '' 'и «глубиной» из 2, мне нужно получить отмеченные 12 узлов - так как они находятся в 2 шагах от 13.
Я использовал jo4neo в этом ...
Как я могу достичь такой же функциональности в Cypher или Gremlin?
Я нашел пример друга-друга, но это мне не помогает, потому что мне нужна глубина, чтобы быть параметром (то есть в некоторых случаях я хочу глубины 4, иногда 6).
Примечание: Есть также другие соединения, кроме полей, но мне, очевидно, мне просто нужны поля. Также мне нужно получить все подключенные узлы - не только в одном направлении.
Решение: Благодаря указателю я получил решение:
start n=node(13) match n-[*1..2]->b where b.__type__ = "model.Field" return distinct b
Решение
http://docs.neo4j.org/chunked/snapshot/query-match.html#match-variable-length-relationships
START a=node(3)
MATCH a-[:FRIEND*1..3]->x
RETURN a,x
Если вы хотите ровно 3 шага:
MATCH a-[:FRIEND*3..3]->x
Надеюсь это поможет!
Другие советы
А что делать, чтобы найти уровень глубины? означает AS *1..3
Отображает «a-> b, a-> b-> c & a-> b-> c-> d». Случай a-> b; 2 В случае a-> b-> c & так далее.