Neo4J obtiene nodo por ID

84

Estoy usando neo4j para uno de mis proyectos, hay un nodo que solo tiene una propiedad única name, quiero obtener ese nodo usando ID, ya tiene una ID pero cuando uso este código

MATCH (s:SKILLS{ID:65110}) return s

No devuelve nada, aquí está mi nodo

ingrese la descripción de la imagen aquí

Si la consulta es incorrecta, ¿cómo la consulto usando el número?

Niraj Chauhan
fuente
¿Qué herramienta de visualización de gráficos utilizas? Gracias. Conozco yworks.com/neo4j-explorer, una buena opción de personalización.
MyUserInStackOverflow

Respuestas:

136
MATCH (s)
WHERE ID(s) = 65110
RETURN s

La IDfunción le da la identificación de un nodo o relación. Esto es diferente de cualquier propiedad llamada ido IDque cree.

Damon Horrell
fuente
1
¿Hay alguna forma diferente de obtener datos como (s: SomeLabel {id: 65110})?
DonkeyKong
@DonkeyKong No, porque también puede agregar la propiedad id, que es algo más que id. Una propiedad de id puede tener cualquier tipo, mientras que el nodo o id de borde es un entero sin signo, vinculado a una ubicación en la estructura interna de Neo4J.
pvoosten
25
DESCARGO DE RESPONSABILIDAD ESTÁNDAR: No utilice ID internos de Neo4j para identificación de entidades a largo plazo. Las versiones futuras de Neo4j podrían cambiar estos ID por motivos de rendimiento. Cree su propia propiedad de identificación única (idealmente con a CONSTRAINT) para rastrear entidades
Brian Underwood
Añadiendo el párrafo de documentación oficial de cifrado si alguien está interesado: neo4j.com/docs/cypher-manual/current/clauses/match/…
Ziemowit Stolarczyk
13

Advertencia: ¡La siguiente respuesta es incorrecta! START solo debe usarse al acceder a índices heredados . Está deshabilitado en Cypher 2.2 y posteriores .

Neo4j recomienda usarloWHERE ID(n) = y, además, afirma que solo requerirá una única búsqueda (no escanea todos los nodos para encontrar la ID correspondiente)

Mantener esta respuesta para evitar que alguien cometa el mismo error.

Usted puede usar WHERE ID(s) = 65110, pero esto se compruebe la ID de cada nodo en su base de datos.

Hay una forma más eficiente de hacer esto:

START s=NODE(517) MATCH(s) RETURN s
Codificación
fuente
Los resultados de EXPLAIN y PROFILE para una consulta simple me mostraron que @Code tenía razón. ¿Por qué esto no está en los documentos?
Sonata
@Sonata ¿Qué versión está ejecutando? Las versiones más recientes de Neo4j deberían hacer que START sea obsoleto.
Codificación
3.0.7. Eche un vistazo a Result Detailsestos ejemplos en la consola: console.neo4j.org/r/dbz1we (haciendo un AllNodesScan) y console.neo4j.org/r/9076wd (haciendo un NodeById)
Sonata
@Sonata No estoy seguro de por qué sucede esto. En primer lugar, no debería funcionar: los documentos indican que START está obsoleto a partir de Cypher 2.0 y deshabilitado a partir de Cypher 2.2, pero claramente sigue funcionando. En segundo lugar, MATCH with ID debería ser un +NodeByIdSeeknodo de acceso de solo 1, pero por alguna razón está haciendo un +AllNodesScan.
Codificación
4

puedes decir:

(n:User) where id(n) >=20 RETURN n

esto devolverá todos los nodos de tipo Usuario con ID de referencia de nodo superior a 20

Wesam Na
fuente