0

我有一个看起来像这样的图表

a-[:LIKES { frequency:6 }]->ice b-[:LIKES { frequency:3 }]->pizza 等

我正在运行此查询,以找出两个人喜欢的常见食物。如果我对频率属性进行汇总以创建食物的相似索引,则效果很好。

START b=node:node_auto_index(name='B') 
MATCH p = b-[r1:LIKES]->stuff, someone_else_too -[r2:LIKES]->stuff 
WITH b, someone_else_too, r1.frequency + r2.frequency AS likeIndex 
RETURN likeIndex ,someone_else_too 
ORDER BY likeIndex DESC

但是,我想做的是找到两个频率值的最小值(不是总数的最小值)。所以像这样的 min(r1.frequency, r2.frequency)。如果一对中的一个对特定食物具有非常高的亲和力,那么我们的目标是消除会增加相似排名的偏度。

    START b=node:node_auto_index(name='B') 
    MATCH p = b-[r1:LIKES]->stuff, someone_else_too -[r2:LIKES]->stuff 
    WITH b, someone_else_too, min(r1.frequency,r2.frequency) AS likeIndex 
    RETURN likeIndex ,someone_else_too 
    ORDER BY likeIndex DESC

但是,Cypher 不会接受这种语法。有什么建议或解决方法吗?在此处查看 Neo4j 控制台

4

3 回答 3

1

在 2.0 中,您可以使用case/whenhttp ://console.neo4j.org/r/y8sqi1

START b=node:node_auto_index(name='B') 
MATCH p = b-[r1:LIKES]->stuff, someone_else_too -[r2:LIKES]->stuff 
WITH b, someone_else_too, 
  CASE WHEN r1.frequency < r2.frequency 
    THEN r1.frequency 
    ELSE r2.frequency 
  END AS likeIndex 
RETURN likeIndex ,someone_else_too 
ORDER BY likeIndex DESC
于 2013-08-02T20:54:50.707 回答
1

有一种获得最小值的数学方法:

(r1.frequency + r2.frequency - ABS(r1.frequency - r2.frequency))/2

但它太重了:(

于 2013-10-24T20:15:12.170 回答
1

你可以使用 apoc.coll.min:

  START b=node:node_auto_index(name='B') 
MATCH p = b-[r1:LIKES]->stuff, someone_else_too -[r2:LIKES]->stuff 
WITH b, someone_else_too, apoc.coll.min([r1.frequency, r2.frequency]) AS likeIndex 
RETURN likeIndex ,someone_else_too 
ORDER BY likeIndex DESC
于 2020-12-27T20:19:44.407 回答