【问题标题】:Add criteria coefficients to Neo4j SDN method/Cypher query将标准系数添加到 Neo4j SDN 方法/Cypher 查询
【发布时间】:2015-11-01 08:05:32
【问题描述】:

我需要使用 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 可以吗?如果有,请举个例子。

更新

根据迈克尔的建议,我使用以下语法:

.... (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: Expected 138 to be a java.lang.String,但它是 java.lang.Long

另外,我必须将 Map&lt;String, Double&gt; coefficients 而不是 Map&lt;Long, Double&gt; coefficients 传递到我的 SDN 方法中。

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

【问题讨论】:

    标签: neo4j cypher spring-data-neo4j


    【解决方案1】:

    我认为你应该能够传入一个系数被键入的映射。

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

    coalesce({coefficients}.foo, 1.0)

    【讨论】:

    • 感谢您的回答。我是否需要在单个映射中将标准 ID 和系数作为键/值或作为单独的参数传递?还有什么是“.foo”?
    • 好的,我明白了。“foo”是一个键,其中系数是一个值。但是如何为不同的criteriaIds使用多个系数?如何在这个 Cypjher 查询中使用例如 criteriaId 作为键?
    • 我的意思是例如coalesce({coefficients}.id(c), 1.0) 或类似的东西......现在我无法让它工作。
    • 我让它工作了。我更新了我的问题并添加了我当前的实现。有什么办法可以优化吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2017-12-24
    相关资源
    最近更新 更多