2012-10-29 9 views
5

Wir haben ein Projekt, in dem wir Spring Data Neo4J verwenden. Einer der wichtigsten Einheiten ist unten dargestellt:Suchen von Blattknoten in einer Neo4J-Datenbank

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

Wir haben eine Anforderung, die Endkategorien alle, um herauszufinden, (das heißt, Kategorien ohne Kinder) aus einer bestimmten Kategorie starten, dessen Name bekannt ist. Zum Beispiel, angesichts der Hierarchie weiter unten:

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

eine Suche nach „Möbeln“ zurückkehren sollte „Office-Tabellen“, „Home-Tabellen“, „Liegestühle“ und „Bürostühle“. Ähnlich sollte eine Suche nach "Computing" "Desktop", "Laptop", "Tablet" und "Netbook" zurückgeben.

Benötigen Sie Hilfe beim Erstellen einer Abfrage, die auf eine Spring Data-Repository-Methode platziert werden kann, um mir alle Blattknoten beginnend mit dem angegebenen Knoten zu geben.

EDIT Die folgende Abfrage (mit der zugehörigen Spring Data Repository-Methode) arbeitete nach Hilfe von 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); 

Antwort

11

Dies ist die einfachste Art, wie ich mit Chiffre gefunden habe: 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) 

Edit: (seit Menschen sind vor kurzem upboting dies ... hier ist ein Update mit 3.x Chiffre)

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

Wenn Sie alle Blattknoten in Chiffre 3,0
http://console.neo4j.org/r/leaf-nodes

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

+0

Dies funktioniert nur zu finden suchen, wenn Beziehung Richtung kein Faktor in der Eltern/Kind-Beziehung des Graphen ist (wobei beide Knoten in einem 2-Knoten-Untergraphen als Blattknoten betrachtet würden). Andernfalls wird dies nicht funktionieren, da die Abfrage auch auf dem übergeordneten Element eines 2-Knoten-Untergraphen (sowie dessen untergeordneten) übereinstimmen wird. Definitionsgemäß ist ein Blattknoten ein Knoten ohne untergeordnete Knoten (aber mindestens ein übergeordneter Knoten), und das ist nicht das, was diese Abfrage überprüft. Diese Abfrage kann auch keine Blattknoten in einem Nicht-Baum-Diagramm identifizieren, in dem mehrere eingehende Beziehungen, aber keine ausgehenden Beziehungen vorhanden sind. – InverseFalcon

+0

Ja für eine ungerichtete Grafik – Scott

Verwandte Themen