2

我对 cypher 和 neo4j 非常陌生。我想根据总路径成本获取和订购点 A 和 B 之间的所有路径。在这种情况下,成本是一个整数关系属性。路径成本将是关系属性的总和。

我正在查看 cypher 的 ORDER BY 语句的一些示例,但是,通过这些示例,您似乎必须按已经分配给被排序对象的属性进行排序,在这种情况下,由于路径没有一个静态的“成本”属性。

(这与路径的长度/数量不同)

我很确定这样的事情对于密码来说并不太复杂。

4

2 回答 2

9

几天前,我尝试并没有做与此非常相似的事情。问题在于您无法获得集合的总和,而只能获得聚合的总和。

请参阅: https ://groups.google.com/d/topic/neo4j/_MqwGp1a1Oo/discussion

我希望他们会在 Cypher 中为此添加一些功能,但即使在专家 Michael Hunger 的帮助下,我也无法让它工作。

更新我今天实际上戳了一下 Cypher 代码,以制作一个完全可以做到这一点的表达式。我不确定它是否会被 1.9 接受,但也许它的某种形式会很快进入社区版。

更新 2他们已在我的拉取请求中合并reduce到 1.9-SNAPSHOT,我将更新下面的语法。

它基本上完全符合您的要求——我的数据的一个稍微陈旧的版本在这里: http ://console.neo4j.org/r/2rvznu

这是 Cypher(注意,目前需要 1.9-SNAPSHOT):

   START n=node(18) 
   MATCH p=n-[r*]->m 
   WHERE not(m-->()) 
    WITH extract(x in r: x.score) as scores, length(p) as len
  RETURN scores, reduce(res=0, x in scores: res + x) as totalscore, len 
ORDER BY totalscore desc;

给出:

+------------------------------------------+
| scores        | totalscore         | len |
+------------------------------------------+
| [0.9,0.9,3.7] | 5.5                | 3   |
| [0.8,0.79]    | 1.59               | 2   |
| [0.4,0.75]    | 1.15               | 2   |
| [0.4,0.45]    | 0.8500000000000001 | 2   |
+------------------------------------------+
于 2012-09-25T17:23:03.973 回答
1

为了方便大家在谷歌上搜索这个问题,我将@eve-freeman 的答案更新为 Neo4j 3.0

START n=node(18) 
   MATCH p=(n)-[r*]->(m) 
   WHERE not((m)-->()) 
    WITH extract(x in r| x.score) as scores, length(p) as len
  RETURN scores, reduce(res=0, x in scores| res + x) as totalscore, len 
ORDER BY totalscore desc;

区别在于: 需要括号来标识模式中的节点 而不是冒号:用于分隔“列表中的变量”和函数中的表达式

于 2016-05-26T21:53:32.107 回答