2012-01-10 1 views
2

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

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

I граф дб (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 
+0

Может ли кто-нибудь предоставить версию гремлина? – Kevin

ответ

4

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 

Надеются, что это помогает!

+0

спасибо ... что указало мне немного в правильном направлении ... но так как у меня много отношений (север/восток/юг/запад) - могу ли я просто использовать: «MATCH a - [: north * 1..3 ,: south * 1..3, ..] -> x ", чтобы получить все подключенные? – Niko

0

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

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