2012-01-29 56 views
50

Soy nuevo en Neo4j, empecé a jugar con él ayer por la tarde.Identificadores de nodo en neo4j

He notado que todos los nodos se identifican mediante un entero de incremento automático que se genera durante la creación del nodo, ¿es así siempre?

Mi conjunto de datos tiene claves de cadena naturales, así que me gustaría evitar tener que mapear entre los identificadores asignados a Neo4j y los míos. ¿Es posible utilizar identificadores de cadena en su lugar?

Respuesta

64

Piense en el ID de nodo como un detalle de implementación (como el rowid de bases de datos relacionales, se puede usar para identificar nodos pero no se debe confiar en que nunca se volverá a usar).

Agregará sus claves naturales como propiedades al nodo y luego indexará sus nodos con la clave natural (o habilitará la indexación automática para ellos).

E..g en la API de 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-controlador paso a paso que le permitirá indexación automática para el 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(); 

Ver: http://docs.neo4j.org/chunked/milestone/auto-indexing.html Y: http://docs.neo4j.org/chunked/milestone/indexing.html

+8

Gracias Michael, exactamente lo que necesitaba saber. Esto obviamente no es demasiado común, ¡la documentación y la discusión son muy ligeras en el terreno! –

+2

@Michael Hunger cuando llamas a n.setProperty ("id", "my-natural-key"); ¿Está creando una identificación diferente de la identificación de nodo autogenerada que neo4j crea correcta?¿O se trata de un intento de sobrescribir la identificación que utiliza neo4j? –

+0

@ michael-hunger ¿Es posible agregar una propiedad de autoincremento? ¿O tengo que crear identificadores únicos para los nodos que creo? – satoru

0

Esto debería ayudar:

crear el índice para respaldar la indexación automática durante la importación por lotes Nos sabemos que si la indexación automática está habilitada en Neo4j. propiedades, cada nodo que se crea se agregará a un índice llamado node_auto_index. Ahora, aquí está lo bueno. Si agregamos el índice manual original (en el momento de la importación por lotes) y lo nombramos como node_auto_index y habilitamos la indexación automática en neo4j, los nodos insertados en lotes aparecerán como auto-indexados. Y a partir de ahí cada vez que se crea un nodo, el nodo la indexación, así **

Fuente:. Identifying nodes with Custom Keys

0

Más allá de todas las respuestas, neo4j crea sus propias identificaciones para trabajar más rápido y servir mejor. Asegúrese de que el sistema interno no entre en conflicto con los ID, entonces creará nodos con las mismas propiedades y se mostrará en el sistema como nodos vacíos.

1

Es posible establecer identificadores únicos para nodos/relaciones en Neo4J. Puede configurarlo para indexar estableciéndolo en uno de los archivos de configuración.

Además, esto es muy recomendable, es decir, se trata de una identificación "natural" para los nodos y bordes, en lugar de utilizar la identificación seq de Neo4j. Esto te ahorrará un viaje redondo al DB en la línea. Esto es lo que hice en el pasado.