Neo4j/Gremlin/Cypher: как получить все узлы, пока я не достигну определенного расстояния (глубины) в настройке, похожей на карту?

У меня есть простой график с полями - каждое поле имеет 4 соседа (северо-восток-юго-запад):

@NodeEntity
public class Field {
    @GraphId
    Long id;
    Field north;
    Field east;
    Field south;
    Field west;
    //.. other stuff
}

Я настроил базу данных графа (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 в этом...

Как я могу добиться той же функциональности в шифре или гремлине?

Я нашел пример друга друга, но это мне не очень помогает, потому что мне нужно, чтобы глубина была параметром (т.е. в некоторых случаях я хочу глубину 4, иногда 6).

Примечание: есть и другие соединения, кроме полей, но мне, очевидно, нужны только поля. Также мне нужно получить все подключенные узлы, а не только в одном направлении.

Решение: Благодаря указателю я получил решение:

start n=node(13) match n-[*1..2]->b where b.__type__ = "model.Field" return distinct b

person Niko    schedule 10.01.2012    source источник
comment
Может ли кто-нибудь предоставить версию гремлина этого?   -  person Kevin    schedule 30.06.2015


Ответы (2)


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

Надеюсь это поможет!

person Andres    schedule 10.01.2012
comment
спасибо... это немного указало мне правильное направление... но поскольку у меня несколько отношений (север/восток/юг/запад), могу ли я просто использовать: MATCH a-[:north*1..3,: south*1..3,..]-›x, чтобы получить все подключенные? - person Niko; 11.01.2012
comment
ссылка мертва - person canbax; 16.01.2019

И что делать, чтобы найти уровень глубины? означает, что *1..3 отображает "A->B, A->B->C & A->B->C->D" в результате шифрованного запроса Андреса, что я хочу найти в графе глубины, т.е. , 1 в случае A->B; 2 в случае A->B->C и так далее.

person ShreyansS    schedule 13.03.2014