Neo4j / Gremlin / Cypher: comment obtenir tous les nœuds jusqu'à atteindre une certaine distance (profondeur) dans une carte semblable à l'installation?

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

  •  26-10-2019
  •  | 
  •  

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
Était-ce utile?

La solution

http: //docs.neo4j. org / Chunked / snapshot / requête match.html # match longueur variable relations

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top