我需要使用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
列表一起,我想将一系列标准系数传递给查询。
Сoefficients不是强制性的。例如,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语句我需要将长id(c)
转换为字符串''+id(c)
,否则会失败并出现以下异常:
嵌套异常是org.neo4j.cypher.CypherTypeException:预期138是一个java.lang.String,但它是一个java.lang.Long
另外,我必须将Map<String, Double> coefficients
而不是Map<Long, Double> coefficients
传递到我的SDN方法中。
有没有办法优化这种方法?例如,避免使用类型转换或/并以更优雅的方式实现空指针验证?
答案 0 :(得分:1)
我认为你应该能够传入系数键入的地图。
对于那些不存在的,您可以使用默认值
coalesce({coefficients}.foo, 1.0)