将标准系数添加到Neo4j SDN方法/ Cypher查询

时间:2015-11-01 08:05:33

标签: neo4j cypher spring-data-neo4j

我需要使用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列表一起,我想将一系列标准系数传递给查询。

С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 ....
  1. 我需要检查c是否为空,因此我正在使用CASE语句
  2. 我需要将长id(c)转换为字符串''+id(c),否则会失败并出现以下异常:

    嵌套异常是org.neo4j.cypher.CypherTypeException:预期138是一个java.lang.String,但它是一个java.lang.Long

  3. 另外,我必须将Map<String, Double> coefficients而不是Map<Long, Double> coefficients传递到我的SDN方法中。

    有没有办法优化这种方法?例如,避免使用类型转换或/并以更优雅的方式实现空指针验证?

1 个答案:

答案 0 :(得分:1)

我认为你应该能够传入系数键入的地图。

对于那些不存在的,您可以使用默认值

coalesce({coefficients}.foo, 1.0)