2012-10-29 16 views
5

Abbiamo un progetto in cui utilizziamo Spring Data Neo4J. Uno dei soggetti più importanti è la seguente:Ricerca di nodi foglia in un database Neo4J

@NodeEntity 
public class Category { 
    @GraphId 
    Long id; 

    String name; 

    @RelatedTo(direction = Direction.INCOMING, type = "CHILD") 
    Category parent; 

    @RelatedTo(direction = Direction.OUTGOING, type = "CHILD") 
    Set<Category> children; 
} 

Abbiamo un requisito per scoprire tutte le categorie foglia (cioè categorie senza figli) a partire da una determinata categoria il cui nome è noto. Ad esempio, data la gerarchia illustrato di seguito:

Electronics 
    Camera 
     Point and Shoot 
     SLR 
    Computing 
     Desktop 
     Laptop 
     Tablet 
     Netbook 
Furniture 
    Tables 
     Office tables 
     Home tables 
    Chairs 
     Lounge chairs 
     Office chairs 

una ricerca per "Mobili" dovrebbe restituire "Tavoli da ufficio", "tavoli per la casa", "sedie a sdraio" e "Sedie da ufficio". Allo stesso modo, una ricerca per "Computing" dovrebbe restituire "Desktop", "Laptop", "Tablet" e "Netbook".

Hai bisogno di aiuto nella creazione di una query di cifratura che può essere inserita in un metodo di repository dati Spring per darmi tutti i nodi foglia a partire dal nodo specificato.

EDIT La seguente query (con il metodo repository Associated Spring Data) ha lavorato, dopo l'aiuto di Wes:

@Query(
"START category=node:__types__(className='org.example.domain.Category') " + 
"MATCH category-[:CHILD*0..]->child " + 
"WHERE category.name={0} AND NOT(child-[:CHILD]->()) " + 
"RETURN child") 
List<Category> findLeaves(String name); 

risposta

11

Questo è il modo più semplice che ho trovato con Cypher: http://console.neo4j.org/r/cgrndo

start n=node(*) // you can specify a single node here if you want 
match n-[r*]->m 
where not(m-->()) // this limits m to be only leaf nodes 
return distinct m; // this returns the distinct leaf nodes (not necessary if there are only simple paths) 

Modifica: (poiché la gente sta inviando di nuovo questo ... ecco un aggiornamento utilizzando 3.x cypher)

match (n) 
where not (n)-->() 
return distinct n 
-1

Se stai cercando di trovare tutti i nodi foglia in cifra 3,0
http://console.neo4j.org/r/leaf-nodes

match (n)-[r]-() with n, count(r) as c where c = 1 return n

+0

Funziona solo se la direzione rapporto non è un fattore nella relazione padre/figlio del grafico (dove entrambi i nodi in un sottografo a 2 nodi sarebbero considerati nodi foglia). Altrimenti questo non funzionerà, poiché la query corrisponderà anche al genitore di un sottografo a 2 nodi (così come al suo figlio). Per definizione un nodo foglia è un nodo senza nodi figlio (ma almeno un nodo genitore), e questo non è ciò che questa query sta controllando. Inoltre, questa query non riuscirà a identificare i nodi foglia in un grafico non ad albero, in cui vi sono più relazioni in entrata ma nessuna relazione in uscita. – InverseFalcon

+0

Sì per un grafico non orientato – Scott

Problemi correlati