tutorial sheet downloads cheat neo4j cypher

sheet - neo4j enterprise



Problema Neo4j con la aplicación de índices (1)

Me encuentro con un problema en el que estoy imponiendo el uso de un índice en una consulta por lotes Cypher,

UNWIND {rows} AS row MATCH (s:Entity) USING INDEX s:Entity(uuid) WHERE s.uuid = row.source MATCH (t:Entity) USING INDEX t:Entity(uuid) WHERE t.uuid = row.target MATCH (s)-[r:CONSUMED]->(t) DELETE r

donde row.source y row.target y ambas cadenas de UUID. El problema es que obtengo el error, ERROR - Cannot use index hint in this context .

Si aumente la consulta, simplemente devolveré la relación para un nodo de origen y destino específico en la UI de Neo4j, es decir,

MATCH (s:Entity) USING INDEX s:Entity(uuid) WHERE s.uuid = ''04bc79e1-a836-11e6-b841-22000bcec6a9'' MATCH (t:Entity) USING INDEX t:Entity(uuid) WHERE t.uuid = ''a245f46a-a837-11e6-b841-22000bcec6a9'' MATCH (s)-[r:CONSUMED]->(t) RETURN r

no se produce ningún error y se devuelve la relación, y por lo tanto estoy algo perplejo sobre cuál podría ser el problema.


[ACTUALIZADO]

Su segunda consulta también cambió las cláusulas WHERE , razón por la cual funcionó.

neo4j no admite actualmente el uso de la cláusula USING INDEX para un índice que se utilizará para comparar valores de propiedad entre sí (como lo hace en su primera consulta).

Nota: las últimas versiones de neo4j en realidad pueden usar el índice en ese escenario, pero si intentas especificar la cláusula USING INDEX como una pista, neo4j se quejará. Esto es probablemente un error. He enviado el Issue 8463 para esto.

Sin embargo, neo4j no tiene problemas con la cláusula USING INDEX cuando el índice se usa para comparar un valor de propiedad con un identificador o un literal (como lo hace en su segunda consulta).

Afortunadamente, hay una solución simple. Solo puede crear identificadores para los valores de propiedad y usar esos identificadores en su lugar. Por ejemplo, vea cómo se usa la cláusula WITH aquí:

UNWIND {rows} AS row WITH row.source AS source, row.target AS target MATCH (s:Entity) USING INDEX s:Entity(uuid) WHERE s.uuid = source MATCH (t:Entity) USING INDEX t:Entity(uuid) WHERE t.uuid = target MATCH (s)-[r:CONSUMED]->(t) DELETE r