2014-07-21 34 views
7

C'è un modo per modellare le gerarchie di tipi in Neo4j? Se per esempio voglio costruire una gerarchia di classi di auto, potrei avere un tipo base di "Car" e quindi avere sottoclassi che estendono tale, come "SportCar", ecc.Come lavorare con le gerarchie di tipi in Neo4j?

Mi piacerebbe essere in grado per creare istanze di "SportCar", ma eseguire una query per ottenere tutte le "Auto". È possibile? Se sì, qual è la tecnica?

Penso che quello che sto cercando di fare è creare una "gerarchia di etichette" - ma non penso che sia supportato in neo4j.

+0

Sembra un duplicato di http://stackoverflow.com/questions/21402271/do-having-multiple-labels-for-a-node-in-neo4j-make-any-sense – cybersam

+0

Una cosa che ho imparato dopo aver letto di più su neo4j è che non esiste un sistema di "tipo". La cosa più vicina che hanno è quella che chiamano "etichette" che sono fondamentalmente solo "tag" che puoi mettere su un nodo. Pertanto, le gerarchie di navigazione sono totalmente realizzabili, ma è necessario costruire le query in modi più specifici, poiché non esiste supporto per i "tipi" ecc. –

+0

AgensGraph (fork PostgreSQL esteso con funzionalità DB grafico) ha gerarchie di etichette: http : //www.agensgraph.com/agensgraph-docs/agensgraph_data_model.html#labels –

risposta

10

Paul,

In primo luogo, vi consiglio di leggere "database del grafico", un'O'Reilly e-book gratuito disponibile presso this link.

Come una risposta rapida, ci sono numerosi modi per fare questo genere di cose, e la scelta migliore dipende dal problema che stai cercando di risolvere. Un modo potrebbe essere quello di costruire un nodo di "Car", quindi in relazione i nodi "sportcar" per il nodo "Car" con un rapporto digitato come

CREATE (m:Car) 
MATCH (m:CAR) WITH m CREATE (n:SportCar)-[:IS_A]->(m) 

e creare altri tipi di vetture, anche loro in materia di auto nodo.

È possibile quindi trovare tutte le auto via

MATCH (m:Car)<-[:IS_A]-(n) RETURN n 

Si può anche semplicemente mettere Auto e sportcar (e LuxoCar, ecc) etichette su ogni nodo. E questo è solo uno dei tanti approcci.

Grazia e pace,

Jim

+3

Ya so che puoi applicare una relazione "IsA" mentre crei i nodi, ma questo non ti permette di fare un "MATCH (c: Car) RETURN c "e recupera tutte le auto, comprese le auto che sono sottoclassi di auto. Non penso che neo4j supporti l'ereditarietà nelle ricerche. Per essere chiari, OrientDB supporta questo - che immagino sia solo una differenza fondamentale tra le due piattaforme. Inoltre, l'approccio dell'etichetta non è scalabile e sarebbe un disastro da gestire quando cambia la gerarchia - immagina di dover tornare indietro e aggiornare tutte le etichette precedenti, ecc. –

2

Quindi l'armadi cosa che ho potuto venire in mente è questo esempio.

Passaggio 1: creare una gerarchia di tipi di automobili.

create (c:CarType{Code:"Car"}) 
create (sc:CarType{Code:"SportCar"}) 
create (sc)-[:SubCarOf]->(c) 

Fase 2: Creare un'istanza di un "sportcar" e registrare che (tramite una proprietà rapporto) è "CarType".

merge (sc:CarType{Code:"SportCar"}) 
create (i:SportCar) 
create (i)-[:CarType]->(sc) 

Fase 3: Scrivere una query che trova tutti s "CarType" che derivano da "Car" e quelle che sono solo di tipo "Car", poi trovare le istanze di questi.

match (c)-[:CarType]->(ct:CarType{Code:"Car"}) 
return c as Car 
union 
match (sct)-[:SubCarOf*]->(ct:CarType{Code:"Car"}), 
(c)-[:CarType]->(sct) 
return c as Car 
1

Ci sono almeno due modi per farlo:

1) utilizzare etichette multiple per ogni oggetto

CREATE(BMW325d:Car:PassengerCar:DieselCar) 
CREATE(Porsche911:Car:SportsCar:...) 

2) Creare un'ontologia

Il secondo modo di modellare una gerarchia di classi consiste nell'utilizzare le ontologie. Sebbene i dati dei modelli Neo4j come un grafico delle proprietà e le ontologie siano più adatti per gli archivi Triple RDF, ci sono modi per usarli.

È possibile creare l'ontologia utilizzando Protégé (Open Source). Quindi salva l'ontologia in un file .owl e caricalo su Neo4j usando questo Plugin. Dopo aver affermato i tuoi nodi in Neo4j al Metagraph creato in Protégé. Una descrizione più dettagliata è descritta here.

di più su questo argomento ...

Per i vostri scopi un RDF Triple Store è un'opzione interessante, vi preoccupa se si desidera aggiungere la semantica ai dati piace usare inferenze e l'ereditarietà. Raccomando di dare un'occhiata più da vicino ai Triple Stores RDF, che sono anche dei grafici, ma memorizzano i dati in triple (soggetto - predicato - oggetto) invece di nodi e relazioni. Top Braid Composer è uno strumento "facile da imparare" per iniziare.

Anche se, spero che il divario tra i grafici delle proprietà e i negozi tripli RDF si riduca presto al momento in cui si tratta di un compromesso. Quindi è necessario impostare attentamente i requisiti sul database prima di sceglierne uno.

Spero che questo aiuti.