需要在cypher中获取最大值

时间:2014-09-19 12:19:52

标签: neo4j cypher

我正在使用下面的cypher查询获取两个值,其中我需要获取最大值。有可能吗?

with ['get','all','Movie','The Matrix'] as toks unwind toks as tok 
match (a) where any(x in labels(a) where x=tok)
return a ,1 as rank UNION
with ['get','all','Movie','The Matrix'] as toks unwind toks as tok 
match (a) where a.title =tok
return a,2 as rank  

我无法附加屏幕截图,所以只是粘贴查询正在运行,输出就是从中获取的:

WITH ['get','all','Movie','The Matrix'] AS toks UNWIND toks as tok 
MATCH (a)WHERE ANY(x IN LABELS(a) WHERE x=tok) 
OR a.title = tok RETURN DISTINCT (a), 
    CASE WHEN a.title = tok THEN 2
    ELSE 1 END as rank

响应:

  • {“title”:“查理威尔逊的战争”,“发布”:2007年,“标语”:“僵硬 喝。一点点睫毛膏。很多神经。谁说他们无法带来 苏联帝国。“} 1

  • {“title”:“The Polar 快递“,”发布“:2004,”标语“:”这个假日季节' 相信“} 1 {”title“:”他们的联盟 自己“,”发布“:1992,”标语“:”一生一次,你有机会 做一些不同的事情。“} 1

  • { “标题”:“的 Matrix“,”发布“:1999,”标语“:”欢迎来到真实世界“} 2

这里有1,1,2是被退回的等级。我只需要返回最大等级。就我而言,它应该只返回一行

  {"title":"The
   Matrix","released":1999,"tagline":"Welcome to the Real World"}   **2**

1 个答案:

答案 0 :(得分:0)

我会尝试使用案例陈述来实现这一点。

WITH ['get','all','Movie','The Matrix'] AS toks UNWIND toks as tok 
MATCH (a)
WHERE ANY(x IN LABELS(a) WHERE x=tok) 
OR a.title = tok
RETURN DISTINCT (a), 
    CASE WHEN a.title = tok THEN 2
    ELSE 1 END as rank

这样做的好处是不会两次运行UNWIND。重要的是要注意可能具有标签匹配和标题匹配的任何结果的大小写顺序。在示例中,我在标签上给出了匹配,并且title仍将返回2,因为case语句将在第一个匹配的情况下返回。

修改

不完全理解你想要实现什么,但是理解我当前的迭代实际上并不起作用(DISTINCT返回不同的行而不是值),我很快就做了一个非常简单的控制台示例,你可以看到here

WITH ['get', 'all', 'Movie', 'The Matrix'] AS toks
MATCH (a)
WHERE ANY (x IN LABELS(a) 
       WHERE x IN toks) OR a.title IN toks
RETURN a AS thing,CASE
WHEN a.title IN toks
THEN 2
ELSE 1 END AS rank
ORDER BY rank DESC , thing.title ASC

案例陈述优先处理标题,给它排名为2,排序时我的排名为2而不是1。

编辑2 如果您只想获得最佳结果,那么使用我上面添加的排序(带或不带title元素,将查询限制为单个结果(您可以在控制台中使用它)。

WITH ['get', 'all', 'Movie', 'The Matrix'] AS toks
MATCH (a)
WHERE ANY (x IN LABELS(a) 
       WHERE x IN toks) OR a.title IN toks
RETURN a AS thing,CASE
WHEN a.title IN toks
THEN 2
ELSE 1 END AS rank
ORDER BY rank DESC , thing.title ASC
LIMIT 1