2012-01-29 41 views
50

Sono nuovo di Neo4j - ho appena iniziato a giocarci ieri sera.Identificatori dei nodi in neo4j

Ho notato che tutti i nodi sono identificati da un numero intero auto-incrementato che viene generato durante la creazione del nodo - è sempre così?

Il set di dati contiene chiavi a corda naturale, quindi vorrei evitare di dover eseguire il mapping tra gli ID assegnati a Neo4j e il mio. È possibile utilizzare invece identificatori di stringa?

risposta

64

Pensare al nodo-id come a un dettaglio di implementazione (come il rowid dei database relazionali, può essere usato per identificare i nodi ma non dovrebbe essere invocato per non essere mai riutilizzato).

Aggiungere le chiavi naturali come proprietà al nodo e quindi indicizzare i nodi con la chiave naturale (o abilitare l'autoindicizzazione per essi).

E..g nella API Java:

Index<Node> idIndex = db.index().forNodes("identifiers"); 

Node n = db.createNode(); 
n.setProperty("id", "my-natural-key"); 
idIndex.add(n, "id",n.getProperty("id")); 

// later 
Node n = idIndex.get("id","my-natural-key").getSingle(); // node or null 

con auto-indicizzatore si sarebbe abilitare l'auto-index per il campo "id".

// via configuration 
GraphDatabaseService db = new EmbeddedGraphDatabase("path/to/db", 
MapUtils.stringMap( 
    Config.NODE_KEYS_INDEXABLE, "id", Config.NODE_AUTO_INDEXING, "true")); 

// programmatic (not persistent) 
db.index().getNodeAutoIndexer().startAutoIndexingProperty("id"); 

// Nodes with property "id" will be automatically indexed at tx-commit 
Node n = db.createNode(); 
n.setProperty("id", "my-natural-key"); 

// Usage 
ReadableIndex<Node> autoIndex = db.index().getNodeAutoIndexer().getAutoIndex(); 
Node n = autoIndex.get("id","my-natural-key").getSingle(); 

See: http://docs.neo4j.org/chunked/milestone/auto-indexing.html E: http://docs.neo4j.org/chunked/milestone/indexing.html

+8

Grazie Michael, esattamente quello che dovevo sapere. Questa roba non è ovviamente troppo tradizionale, tuttavia la documentazione e la discussione sono molto chiare sul campo! –

+2

@Michael Hunger quando chiamate n.setProperty ("id", "my-natural-key"); stai creando un ID diverso dal nodo del nodo generato automaticamente che neo4j crea correttamente?O si tratta di un tentativo di sovrascrivere l'id che neo4j sta usando? –

+0

@ michael-hunger È possibile aggiungere una proprietà di incremento automatico? O devo creare ID univoci per i nodi che creo? – satoru

0

Questo dovrebbe aiutare:

creare l'indice per eseguire l'indicizzazione automatica durante l'importazione dei lotti Noi sappiamo che se automatica indicizzazione è attivato in Neo4j. proprietà, ogni nodo creato verrà aggiunto a un indice denominato node_auto_index. Ora, ecco il bello. Se aggiungiamo l'indice manuale originale (al momento di importazione batch) e lo chiamiamo come node_auto_index e abilitiamo l'indicizzazione automatica in neo4j, allora i nodi inseriti in batch appariranno come se fosse indicizzato automaticamente. E da lì ogni volta che si crea un nodo, il nodo otterrà indicizzato oltre **

Fonte:. Identifying nodes with Custom Keys

0

Oltre a tutte le risposte ancora neo4j crea i propri ID per lavorare più velocemente e servire meglio. Assicurati che il sistema interno non sia in conflitto tra id, quindi creerà nodi con le stesse proprietà e mostrerà nel sistema come nodi vuoti.

1

È possibile impostare ID univoci per nodi/realtionship in Neo4J. È possibile impostarlo per indicizzarlo impostandolo in uno dei file di configurazione.

Inoltre, si consiglia vivamente di creare un ID "naturale" per nodi e spigoli, anziché utilizzare il seq id Neo4j. Questo ti farà risparmiare un viaggio nel db lungo la linea. Questo è quello che ho fatto in passato.

Problemi correlati