Neo4j Cypher filtrado basado en parámetros del mapa
Basado en la pregunta anterior:
Estructura de consulta Neo4j Cypher y optimización del rendimiento Filtrado de nodos Neo4j Cypher por comprensión de patrones
Finalmente he refactorizado mi consulta a lo siguiente:
MATCH (parentD)-[:CONTAINS]->(childD:Decision)
WHERE id(parentD) = {decisionId}
MATCH (childD)<-[:SET_FOR]-(equalFilterValue)-[:SET_ON]->(equalFilterCharacteristic)
WHERE ALL(key IN keys({equalFilters}) WHERE id(equalFilterCharacteristic) = toInt(key) AND equalFilterValue.value = ({equalFilters}[key]))
WITH DISTINCT childD
MATCH (childD)<-[:SET_FOR]-(rangeFilterValue)-[:SET_ON]->(rangeFilterCharacteristic)
WHERE ALL(key IN keys({rangeFilters}) WHERE id(rangeFilterCharacteristic) = toInt(key) AND ({rangeFilters}[key])[0] <= rangeFilterValue.value <= ({rangeFilters}[key])[1])
WITH * MATCH (childD)-[ru:CREATED_BY]->(u:User)
RETURN ru, u, childD AS decision
SKIP 0 LIMIT 100
Esta consulta funciona bien si cada*filter
type (map) solo tiene una clave, por ejemplo:
queries.add(new InQuery(integerCharacteristic.getId(), 30));
o
queries.add(new InQuery(stringCharacteristic.getId(), "Two"));
pero falla cuando agrego 2 o más condiciones, por ejemplo:
queries.add(new InQuery(integerCharacteristic.getId(), 30));
queries.add(new InQuery(stringCharacteristic.getId(), "Two"));
La siguiente consulta no funciona como se esperaba y mis aserciones de prueba fallan:
MATCH (parentD)-[:CONTAINS]->(childD:Decision)
WHERE id(parentD) = {decisionId}
MATCH (childD)<-[:SET_FOR]-(inFilterValue)-[:SET_ON]->(inFilterCharacteristic)
WHERE ALL(key IN keys({inFilters}) WHERE id(inFilterCharacteristic) = toInt(key) AND ({inFilters}[key]) IN inFilterValue.value)
WITH * MATCH (childD)-[ru:CREATED_BY]->(u:User)
RETURN ru, u, childD AS decision
SKIP 0 LIMIT 100
El parámetro:
inFilters = {3153=30, 3151=Two}
Por qué no funciona cuandoinFilters
mapa contiene 2 o más claves y cómo hacerlo funcionar?