Neo4j / Cypher:使用reduce进行聚合

时间:2014-10-13 20:25:54

标签: neo4j cypher

我试图在neo4j数据库中进行一些基本的相似性搜索。它看起来像这样:

begin
create (_1:`Article` {`name`:"Bow", `weight`:"20"})
create (_2:`Article` {`name`:"Shield", `weight`:"30"})
create (_3:`Article` {`name`:"Knife", `weight`:"40"})
create (_4:`Article` {`name`:"Sword", `weight`:"50"})
create (_5:`Article` {`name`:"Helmet", `weight`:"15"})
create (_6:`Order` {`customer`:"Peter"})
create (_7:`Order` {`customer`:"Paul"})
create (_8:`Order` {`customer`:"Mary"})
create (_9:`Accessory` {`name`:"Arrow",`type`:"optional", `weight`:"2"})
create _6-[:`CONTAINS` {`timestamp`:"1413204480"}]->_1
create _6-[:`CONTAINS` {`timestamp`:"1413204480"}]->_2
create _6-[:`CONTAINS` {`timestamp`:"1413204480"}]->_3
create _7-[:`CONTAINS` {`timestamp`:"1413204480"}]->_1
create _7-[:`CONTAINS` {`timestamp`:"1413204480"}]->_4
create _8-[:`CONTAINS` {`timestamp`:"1413204480"}]->_5
create _9-[:`BELONGS_TO` {`timestamp`:"1413204480"}]->_1
;
commit

非常无意义的数据库,我知道。唯一的原因是这篇文章。

当新订单出现时,我需要查明是否已下达类似订单。类似的意思是:现有的或新的客户和相同的产品。困难的部分是:我需要所有(直接或间接)包含节点的权重之和。

以下是我所拥有的:

START n=node(*)
MATCH p1 = (a:Order)-[*]->n, p2 = (b:Order)-[*]->m
WHERE a<>b AND n.name = m.name
RETURN reduce (sum="", x in p2 | sum+x.weight) limit 25;

然而,似乎p2不是合适的东西。 Cypher期待收藏而不是路径。

真的很抱歉这个新手的帖子,但请放心:我是一个非常感激的新手。谢谢! 雷

1 个答案:

答案 0 :(得分:2)

在您的查询中,您似乎假装p2是新订单的路径。我假设在您的实际查询中,您将b绑定到特定节点。此外,您的时间戳和权重应具有数字值(不带引号)。

此查询将返回&#34; new&#34;的总重量。路径。这是你想要的吗?

MATCH p1 =(a:Order)-[*]->n, p2 =(b:Order)-[*]->m
WHERE a<>b AND n.name = m.name
WITH p2, collect(m) AS ms
RETURN reduce(sum=0, x IN ms | sum+x.weight)
LIMIT 25;

顺便说一下,START n=node(*)是多余的。它与使用未绑定的n相同。

请参阅this console