我对cypher和neo4j非常新。我想根据总路径成本获取并命令A点和B点之间的所有路径。在这种情况下,成本是一个整数的关系属性。路径成本将是关系属性的总和。
我正在查看cypher的ORDER BY语句的一些示例,但是,通过示例,您似乎必须通过已分配给正在排序的对象的属性进行排序,在这种情况下,由于路径不起作用没有静态的“成本”财产。
(这与路径的长度/数量btw不同)
我很确定这样的事情对于密码来说并不复杂。
答案 0 :(得分:9)
请参阅: https://groups.google.com/d/topic/neo4j/_MqwGp1a1Oo/discussion
我希望他们会在Cypher中添加一些功能,但即使在专家的帮助下,我也无法让它工作--Michael Hunger。
UPDATE 我实际上在今天的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 |
+------------------------------------------+
答案 1 :(得分: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;
不同之处在于: 需要括号来标识模式中的节点 管|而不是冒号:用于分隔“列表中的变量”和函数中的表达式