NEO4J/Gremlin/Cypher: Wie bekomme ich alle Knoten, bis ich in einem kartenähnlichen Setup eine bestimmte Entfernung (Tiefe) erreiche?
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
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.