2015-11-01 102 views
0

我需要介绍的标准系数以下SDN库法与Neo4j的暗号查询:添加标准系数Neo4j的SDN方法/ Cypher支架查询

@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有可能吗?如果是这样,请举个例子。

修订

在迈克尔的建议,我把它用语法如下工作:

.... (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中

另外,我要通过Map<String, Double> coefficients代替Map<Long, Double> coefficients纳入我的SDN方法。

有什么办法来优化这种方法?例如避免类型转换或/和以更优雅的方式实现空指针验证?

回答

1

我想你应该能够通过一个系数被锁定的地图。

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

coalesce({coefficients}.foo, 1.0)

+0

谢谢您的回答。我是否需要将criteriaId和系数作为Key/Value传递给单个映射或作为分离的参数?还有什么是“.foo”? – alexanoid

+0

好吧,我知道了..“foo”是系数是一个值的关键..但如何使用多个系数为不同的criteriaIds?如何使用criteriaId作为此Cypjher查询中的关键字? – alexanoid

+0

我的意思是例如'coalesce({系数} .id(c),1.0)'或类似的东西......现在我无法得到它的工作。 – alexanoid