4

我正在尝试在 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,所以一点也不专业。如果有人可以在这里帮助我,我将不胜感激。

4

2 回答 2

9

我用 console.neo4j.org创建了一个小案例

通过以下查询,我回来了[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

在最后一行区分,我回来了[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

看起来订单因不同而丢失。

编辑

在github上对此提出问题后,我确实花了很长时间才得到答案

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

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]!(我还创建了一个更新的测试用例。)

于 2012-12-26T00:00:14.080 回答
0

通过使用聚合函数 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 

H,

安德烈斯

于 2012-12-31T11:38:01.673 回答