将标准系数添加到 Neo4j SDN method/Cypher 查询
Add criteria coefficients to Neo4j SDN method/Cypher query
我需要使用 Neo4j Cypher 查询将标准系数引入以下 SDN 存储库方法:
@Query("MATCH ... ->(c) WHERE id(c) IN {criteriaIds} WITH ... vg.avgVotesWeight as weight RETURN sum(weight) as weight")
List<WeightedDecision> getChildDecisions(@Param("decisionId") Long decisionId, @Param("criteriaIds") List<Long> criteriaIds);
为了实现这样的东西:
MATCH ... ->(c)
WHERE id(c) IN {criteriaIds}
WITH ... (vg.avgVotesWeight * cCoefficient) as weight
RETURN sum(weight) as weight
其中 cCoefficient
是 criteriaIds
列表中某个标准的系数。因此,连同 criteriaIds
列表,我想将标准系数列表传递到查询中。
系数不是强制性的。例如,criteriaIds
列表中的一个标准可以有系数,但另一个标准 - 没有。
现在我不知道如何将这些系数参数(对于 criteriaIds
列表中的所有或某些条件)传递到我的方法并将其绑定到查询。
Neo4j/SDN/Cypher 可以吗?如果是,请举例说明。
已更新
根据 Michael 的建议,我使用以下语法使其工作:
.... (vg.avgVotesWeight * (CASE WHEN c IS NOT NULL THEN coalesce({coefficients}[''+id(c)], 1.0) ELSE 1.0 END)) as weight ....
- 我需要检查
c
是否不为空,所以我正在使用 CASE 语句
我需要将 long id(c)
转换为 String ''+id(c)
否则它会失败并出现以下异常:
嵌套异常是 org.neo4j.cypher.CypherTypeException:预期 138 是 java.lang.String,但它是 java.lang.Long
此外,我必须将 Map<String, Double> coefficients
而不是 Map<Long, Double> coefficients
传递到我的 SDN 方法中。
有什么方法可以优化这种方法吗?例如避免类型转换 or/and 以更优雅的方式实现空指针验证 ?
我认为你应该能够传入一个映射,其中系数是键控的。
对于不存在的,您可以使用
的默认值
coalesce({coefficients}.foo, 1.0)
我需要使用 Neo4j Cypher 查询将标准系数引入以下 SDN 存储库方法:
@Query("MATCH ... ->(c) WHERE id(c) IN {criteriaIds} WITH ... vg.avgVotesWeight as weight RETURN sum(weight) as weight")
List<WeightedDecision> getChildDecisions(@Param("decisionId") Long decisionId, @Param("criteriaIds") List<Long> criteriaIds);
为了实现这样的东西:
MATCH ... ->(c)
WHERE id(c) IN {criteriaIds}
WITH ... (vg.avgVotesWeight * cCoefficient) as weight
RETURN sum(weight) as weight
其中 cCoefficient
是 criteriaIds
列表中某个标准的系数。因此,连同 criteriaIds
列表,我想将标准系数列表传递到查询中。
系数不是强制性的。例如,criteriaIds
列表中的一个标准可以有系数,但另一个标准 - 没有。
现在我不知道如何将这些系数参数(对于 criteriaIds
列表中的所有或某些条件)传递到我的方法并将其绑定到查询。
Neo4j/SDN/Cypher 可以吗?如果是,请举例说明。
已更新
根据 Michael 的建议,我使用以下语法使其工作:
.... (vg.avgVotesWeight * (CASE WHEN c IS NOT NULL THEN coalesce({coefficients}[''+id(c)], 1.0) ELSE 1.0 END)) as weight ....
- 我需要检查
c
是否不为空,所以我正在使用 CASE 语句 我需要将 long
id(c)
转换为 String''+id(c)
否则它会失败并出现以下异常:嵌套异常是 org.neo4j.cypher.CypherTypeException:预期 138 是 java.lang.String,但它是 java.lang.Long
此外,我必须将 Map<String, Double> coefficients
而不是 Map<Long, Double> coefficients
传递到我的 SDN 方法中。
有什么方法可以优化这种方法吗?例如避免类型转换 or/and 以更优雅的方式实现空指针验证 ?
我认为你应该能够传入一个映射,其中系数是键控的。
对于不存在的,您可以使用
的默认值coalesce({coefficients}.foo, 1.0)