Neo4j / Gremlin / Cypher: come ottenere tutti i nodi fino a raggiungere una certa distanza (profondità) in una mappa simile messa a punto?

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

  •  26-10-2019
  •  | 
  •  

Domanda

Ho un semplice grafico con campi - ogni campi ha 4 vicini di casa (nord-est-sud-ovest):

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

un db grafico (Neo4j) impostare quindi queste sono tutte belle e connessi (come una griglia). Quello che voglio fare ora è ottenere tutti i nodi - da un nodo di partenza -. Che sono cioè 5 luppolo lontano

Con un classico traverse questo funziona bene e si presenta così:

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

Quindi, se ho una "mappa" in questo modo:

  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 
interrogazione

ed io con partenza nodo '' 13 '' e di una "profondità" del 2 ho bisogno di ottenere i marcati 12 nodi -. dal momento che sono a 2 passi away da 13

ho usato jo4neo in questo ...

Come posso ottenere la stessa funzionalità in cifra o gremlin?

Ho trovato l'esempio amico-di-amico, ma questo in realtà non mi aiuti, perché ho bisogno della profondità di essere un parametro (vale a dire, in alcuni casi Voglio una profondità di 4, a volte 6).

Nota: ci sono anche altre connessioni ad eccezione dei campi, ma ovviamente solo bisogno i campi. Inoltre ho bisogno di ottenere tutti i nodi connessi -. Non solo in una direzione

Soluzione: Grazie al puntatore ho ottenuto la soluzione:

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

Soluzione

http: //docs.neo4j. org / Chunked / snapshot / query match.html # match-lunghezza variabile-relazioni

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

Se si vuole esattamente 3 passi:

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

Spero che questo aiuti!

Altri suggerimenti

E cosa fare per trovare livello di profondità? mezzi come display *1..3 "A-> B, A-> B-> C & A-> B-> C-> D" a seguito di interrogazione Cypher da Andres, che cosa è che voglio trovare un conte di profondità, vale a dire , 1 in caso di A-> B; 2 in caso di A-> B-> C e così via.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top