【发布时间】:2017-05-11 06:31:10
【问题描述】:
根据上一个问题:
Neo4j Cypher query structure and performance optimization Neo4j Cypher node filtering by pattern comprehension
最后我将查询重构为以下内容:
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
如果每个*filter type(map) 只有一个键,则此查询可以正常工作,例如:
queries.add(new InQuery(integerCharacteristic.getId(), 30));
或
queries.add(new InQuery(stringCharacteristic.getId(), "Two"));
但当我添加 2 个或更多条件时失败,例如:
queries.add(new InQuery(integerCharacteristic.getId(), 30));
queries.add(new InQuery(stringCharacteristic.getId(), "Two"));
以下查询未按预期工作,我的测试断言失败:
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
参数:
inFilters = {3153=30, 3151=Two}
为什么当inFilters map 包含 2 个或更多键时它不起作用以及如何使它起作用?
【问题讨论】: