将标准系数添加到 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

其中 cCoefficientcriteriaIds 列表中某个标准的系数。因此,连同 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 ....
  1. 我需要检查 c 是否不为空,所以我正在使用 CASE 语句
  2. 我需要将 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)