NEO4J/Gremlin/Cypher: Wie bekomme ich alle Knoten, bis ich in einem kartenähnlichen Setup eine bestimmte Entfernung (Tiefe) erreiche?

StackOverflow https://stackoverflow.com/questions/8804966

  •  26-10-2019
  •  | 
  •  

Frage

Ich habe ein einfaches Diagramm mit Feldern-jedes Felder hat 4 Nachbarn (Nordost-Süd-West):

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

Ich habe ein Graph DB (NEO4J) eingerichtet, damit diese alle schön und verbunden sind (wie ein Raster). Was ich jetzt tun möchte, ist, alle Knoten zu bekommen - von einem Startknoten -, der dh 5 Hopfen entfernt ist.

Mit einem klassischen durchqueren, funktioniert dies gut und sieht so aus:

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;
}

Also, wenn ich eine "Karte" wie diese habe:

  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 

Und ich verlange damit, den Knoten '' 13 '' und eine "Tiefe" von 2 zu starten. Ich muss die markierten 12 Knoten bekommen - da sie 2 Schritte entfernt von 13 sind.

Ich habe Jo4neo in diesem ...

Wie kann ich die gleiche Funktionalität in Cypher oder Gremlin erreichen?

Ich habe das Beispiel des Freundes gefunden, aber das hilft mir nicht wirklich, weil ich die Tiefe brauche, um ein Parameter zu sein (dh in einigen Fällen möchte ich eine Tiefe von 4, manchmal 6).

Notiz: Es gibt auch andere Verbindungen außer Feldern, aber ich brauche offensichtlich nur die Felder. Außerdem muss ich alle verbundenen Knoten bekommen - nicht nur in eine Richtung.

Lösung: Dank des Zeigers habe ich die Lösung:

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

Lösung

http://docs.neo4j.org/chunked/snapshot/query-match.html#match-variable-lgth-Relationships

START a=node(3)
MATCH a-[:FRIEND*1..3]->x
RETURN a,x

Wenn Sie genau 3 Schritte wollen:

MATCH a-[:FRIEND*3..3]->x

Hoffe das hilft!

Andere Tipps

Und was tun, um Tiefenstufe zu finden? bedeutet als *1..3 Zeigt "a-> b, a-> b-> c & a-> b-> c-> d" als Ergebnis einer Cypher-Abfrage nach Andres an, was bin ich eine Anzahl der Tiefe, dh 1 in 1 in Fall von a-> b; 2 Bei A-> B-> C & SO weiter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top