【问题标题】:Using neo4j DISTINCT and ORDER BY on different properties在不同的属性上使用 neo4j DISTINCT 和 ORDER BY
【发布时间】:2012-12-24 22:41:52
【问题描述】:

我正在尝试在 neo4j 版本 1.9M02 上运行以下密码查询

START me=node(2)
            MATCH me-[:FOLLOWS]->friends
            ,friends-[fr:ADDED|STOCKS]->products
            ,me-[r?]->products
            WHERE r is null
            RETURN products._id
            ORDER BY fr.CreatedOn DESC
            SKIP 0
            LIMIT 10

我希望得到所有由我的朋友添加或库存但不是我添加或库存的产品,按关系创建时间排序。此查询返回正确的结果,但具有重复的 products._id 值(一个用户添加了该产品,另一个用户将其储存了)。但我只需要这个 products._id 的一个实例,所以我尝试了

START me=node(2)
            MATCH me-[:FOLLOWS]->friends
            ,friends-[fr:ADDED|STOCKS]->products
            ,me-[r?]->products
            WHERE r is null
            RETURN DISTINCT products._id
            ORDER BY fr.CreatedOn DESC
            SKIP 0
            LIMIT 10

(为 products._id 添加了 DISTINCT)但是这次我得到了 Unknown identifier fr 错误。所以我在 RETURN 语句中添加了 fr

START me=node(2)
            MATCH me-[:FOLLOWS]->friends
            ,friends-[fr:ADDED|STOCKS]->products
            ,me-[r?]->products
            WHERE r is null
            RETURN DISTINCT products._id,fr
            ORDER BY fr.CreatedOn DESC
            SKIP 0
            LIMIT 10

此查询正常运行,但返回与以前一样的重复产品 ID。

最近几天我只在玩 neo4j,所以一点也不专业。如果有人可以在这里帮助我,我将不胜感激。

【问题讨论】:

  • 你好,有一个console.neo4j.org的案例,所以我们可以举个例子来摆弄一下?
  • 嗨彼得,很遗憾我没有任何例子。而且我想我需要很长时间才能将我的数据库导入到 console.neo4j。一个问题,如果我在这里发布我的 neo4j 服务器会不会有任何安全问题?这不是实时数据,只有开发数据。

标签: neo4j graph-databases cypher


【解决方案1】:

我用 console.neo4j.org 创建了一个little case

通过以下查询,我返回[4, 3, 2, 4, 3, 2, 4, 3 ,2]

START me=node(1) 
MATCH me-[:FOLLOWS]->friends
,friends-[fr:ADDED|STOCKS]->products
,me-[r?]->products 
WHERE r is null 
with distinct products._id as id, fr.CreatedOn as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN id

将 distinct 放在最后一行,然后我会返回 [3, 4, 2]

START me=node(1) 
MATCH me-[:FOLLOWS]->friends
,friends-[fr:ADDED|STOCKS]->products
,me-[r?]->products 
WHERE r is null 
with distinct products._id as id, fr.CreatedOn as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN distinct id

看起来排序丢失了 distinct。

编辑

在提交an issue on github 之后,我确实花了很长时间才收到answer

答案中的建议是运行此查询:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product, 
WHERE not(me-->product)
RETURN product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 

我修改了查询,使其只返回 ID:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product 
WHERE not(me-->product) 
WITH product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN id

瞧,它返回[4, 3, 2]! (我还创建了一个updated test case。)

【讨论】:

  • 非常感谢您创建案例!似乎 ORDER BY 被忽略了。如果我将 DESC 更改为 ASC,我仍然得到相同的结果。
  • 是的,请提交问题,提供控制台示例,非常感谢!
【解决方案2】:

通过使用聚合函数 MIN,您可以提取最早的 CreatedOn 日期。一旦你有了它,简单地按最早日期排序结果集,如下所示:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product, 
WHERE not(me-->product)
RETURN product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 

第,

安德烈斯

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多