Neo4j / Gremlin / Cypher: comment obtenir tous les nœuds jusqu'à atteindre une certaine distance (profondeur) dans une carte semblable à l'installation?
Question
J'ai un graphique simple avec des champs - chacun des champs a 4 voisins (nord-est-sud-ouest):
@NodeEntity
public class Field {
@GraphId
Long id;
Field north;
Field east;
Field south;
Field west;
//.. other stuff
}
I db un graphique (de Neo4j) mis en place donc ce sont tous très gentils et connecté (comme une grille). Ce que je veux faire est maintenant obtenir tous les nœuds - à partir d'un noeud de départ -. Qui sont à savoir 5 houblon à
Avec un classique traverse cela fonctionne bien et ressemble à ceci:
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;
}
Donc, si j'ai une « carte » comme ceci:
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
et requête I avec noeud de départ « » 13 « » et une « profondeur » de 2 je besoin d'obtenir les 12 nœuds marqués -. Car ils sont à 2 pas de 13 aways
J'utilisé jo4neo dans cette ...
Comment puis-je obtenir les mêmes fonctionnalités dans Cypher ou Gremlin?
Je trouve l'exemple ami-de-ami, mais cela ne m'a pas vraiment aider, parce que je besoin de la profondeur à un paramètre (par exemple dans certains cas, je veux une profondeur de 4, parfois 6).
Remarque: il y a aussi d'autres connexions à l'exception des champs, mais je évidemment juste besoin des champs. Je dois aussi obtenir tous les noeuds connectés -. Pas seulement dans un sens
Solution: Merci au pointeur I obtenu la solution:
start n=node(13) match n-[*1..2]->b where b.__type__ = "model.Field" return distinct b
La solution
START a=node(3)
MATCH a-[:FRIEND*1..3]->x
RETURN a,x
Si vous voulez exactement 3 étapes:
MATCH a-[:FRIEND*3..3]->x
Hope this helps!
Autres conseils
Et que faire pour trouver le niveau de profondeur? des moyens comme *1..3
affiche « A> B, A> B> C & A> B> C> D » à la suite de la requête Cypher par Andres, c'est que je veux trouver un comte de profondeur, à savoir , 1 en cas de A-> B; 2 en cas de A-> B-> C & ainsi de suite.