2014-04-28 3 views
7

Sto cercando di creare un database in Neo4j con una struttura che contenga sette diversi tipi di nodi, in totale circa 4-5000 nodi e tra loro circa 40000 relazioni. Il codice Cypher Attualmente sto usando è che ho prima creare i nodi con il codice:Creazione di nodi e relazioni contemporaneamente in neo4j

Create (node1:type {name:'example1', type:'example2'}) 

intorno al 4000 di quell'esempio con i nodi unici.

rapporti Poi c'ho dichiarati come tali:

Create 
(node1)-[:r]-(node51), 
(node2)-[:r]-(node5), 
(node3)-[:r]-(node2); 

Circa 40000 di tali relazioni uniche.

Con i grafici di scala ridotta questo non ha avuto alcun problema. Ma con questo, la query Esecuzione non interrompe mai il caricamento.

Qualche suggerimento su come posso far funzionare questo tipo di query? O cosa dovrei fare invece?

modifica. Quello che sto cercando di costruire è un grande grafico su un prodotto, con le sue versioni, versioni di rilascio, caratteristiche ecc. Nello stesso modo in cui è costruito l'esempio del grafico del film.

Il prodotto ha circa 6 rilasci in totale, ogni versione ha circa 20 releaseversion. In totale ci sono 371 caratteristiche e di lì 371 caratteristiche ci sono anche 438 featureversions. la mai più releaseversion (120 in totale) ha quindi circa 2-300 featureversions ciascuno. Questi featureversion sono mappati alla sua feature che ha dipendenze verso un po 'di tutto nel db. Ho anche involed dipendenze HW come la possibile hw per eseguire queste caratteristiche su, uscite su ecc im modo basicaly utilizzando il codice cifrato come ad esempio:

Create (Product1:Product {name:'ABC', type:'Product'}) 
Create (Release1:Release {name:'12A', type:'Release'}) 
Create (Release2:Release {name:'13A, type:'release'}) 
Create (ReleaseVersion1:ReleaseVersion {name:'12.0.1, type:'ReleaseVersion'}) 
Create (ReleaseVersion2:ReleaseVersion {name:'12.0.2, type:'ReleaseVersion'})  

e inferiori a quelli li ho strutturato utilizzando

Create (Product1)<-[:Is_Version_Of]-(Release1), 
(Product1)<-[:Is_Version_Of]-(Release2), 
(Release2)<-[:Is_Version_Of]-(ReleaseVersion21),   

per tutto il tragitto verso il basso per le caratteristiche, e poi ho aggiunto anche le dipendenze tra loro, quali:

(Feature1)-[:Requires]->(Feature239), 
(Feature239)-[:Requires]->(Feature51);  

dal momento che ho dovuto trovare tutte queste informazioni da molte diverse excel schede tecniche e tc, ho creato il codice in questo modo pensando di poterlo mettere insieme in una query di massa cifrata ed eseguirlo sul browser/sul localhost. ha funzionato davvero bene fino a quando non ho usato più di 4-5000 query alla volta. Quindi ha creato l'intero database in circa 5-10 secondi al massimo, ma ora quando cerco di eseguire circa 45000 query allo stesso tempo è in esecuzione da quasi 24 ore, e si sta ancora caricando e dicendo "query in esecuzione". .. ". Mi chiedo se c'è comunque che posso migliorare il tempo necessario, il database sarà eventualmente creato? o posso fare alcuni indici più intelligenti o altre cose per migliorare le prestazioni? perché dal modo in cui è scritto il mio cifrario ora non posso dividerlo in pezzi poiché tutto nel database ha una sorta di connessione al prodotto. Devo riscrivere il codice o c'è un modo uniforme?

risposta

11

È possibile creare più nodi e le relazioni interconnesse con una singola istruzione creare, in questo modo:

create (a { name: "foo" })-[:HELLO]->(b {name : "bar"}), 
     (c {name: "Baz"})-[:GOODBYE]->(d {name:"Quux"}); 

Ecco, questo è un approccio, invece di creare ogni nodo singolarmente con una singola istruzione, allora ogni rapporto con un unico dichiarazione.

È inoltre possibile creare più rapporti da oggetti abbinando prima, quindi la creazione di:

match (a {name: "foo"}), (d {name:"Quux"}) create (a)-[:BLAH]->(d); 

Naturalmente si potrebbe avere più clausole di gara, e multiple creare clausole lì.

Si potrebbe provare ad abbinare un determinato tipo di nodo e quindi creare tutte le relazioni necessarie da quel tipo di nodo. Hai abbastanza relazioni che questo richiederà molte domande. Assicurati di aver indicizzato la proprietà che stai utilizzando per abbinare i nodi. Man mano che il DB diventa grande, sarà importante consentire una rapida ricerca di cose che stai cercando di creare nuove relazioni.

Non è stata specificata la query in esecuzione che non "interrompe il caricamento". Aggiorna la tua domanda con specifiche e facci sapere cosa hai provato, e forse è possibile aiutare.

+0

Grazie! Questo dovrebbe essere accettato come risposta – troig

+0

Non abbiamo bisogno di parentesi qui? (a) - [: BLAH] -> (b) – orestiss

+0

Sì. La risposta è stata scritta nel 2014 quando non ne hai avuto bisogno. – FrobberOfBits

0

Se si è in grado di utilizzare le pietre miliari prerelease di Neo4j 2.1, provare a utilizzare le nuove funzioni LOAD CSV e PERIODIC COMMIT. Sono progettati per questo tipo di caso d'uso.

LOAD CSV consente di descrivere la struttura dei dati con uno o più modelli di Cypher, fornendo i valori in CSV per evitare la duplicazione.

PERIODIC COMMIT può aiutare a rendere più affidabili le importazioni di grandi dimensioni e anche a migliorare le prestazioni riducendo la quantità di memoria necessaria.

+0

Sembra una cosa molto interessante da fare, la mia unica domanda è se posso usare le relazioni tra caratteristiche e caratteristiche e avere diversi tipi di relazioni tra loro, perché in questo database ci sono gli stessi tipi di nodi che hanno forse dieci diverse relazioni a quello stesso tipo di nodo. Quindi non posso ad esempio usare: 'CREATE (p) - [: PLAYED {role: csvLine.role}] -> (m)' Oppure sarò in grado di eseguire un po 'del mio database alla volta? perché questo è probabilmente il mio problema attuale, non posso dividerlo in pezzi più piccoli. – ErikOstergren

+0

I tipi di relazione, le etichette e i nomi di proprietà devono essere specificati letteralmente nelle query - i tipi di relazione non possono provenire da un file CSV. Invece, si utilizza in genere un file CSV e una query per tipo. – Andres