【问题标题】:Neo4j / Cypher: aggregate using reduceNeo4j / Cypher:使用reduce聚合
【发布时间】:2014-10-13 20:25:53
【问题描述】:

我正在尝试在 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 需要一个集合而不是路径。

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

【问题讨论】:

  • 你可以使用reduce(sum=0, x IN nodes(p2) | sum + x.weight)
  • 您可能还应该在路径中使用关系类型,而不是无限路径。
  • 嗨,Michael,关系类型在我的项目的待办事项列表中。最终路径将不会超过 5 条左右。在这个阶段,我并不真正关心路径长度,我只想弄清楚这个总和。
  • reduce 函数的文档在哪里?

标签: neo4j cypher


【解决方案1】:

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

此查询将返回“新”路径的总权重。这是你想要的吗?

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

【讨论】:

  • 好东西。谢谢,赛博萨姆!绝对可以帮助我继续。
  • 我的图表进一步发展,我再次陷入困境。该图现在与属性“处理”有关系。当前版本在这里:[链接]console.neo4j.org/r/g9b10p 有一个订单,由 Mary 下的,看起来与 Paul 和 Peter 的非常相似。只是处理方式不同。我想要实现的目标:1. 找到那些用户(Paul 和 Peter)
    2.总结 Mary 的订单图中的处理值 3. 总结 Paul 的订单图中的处理值 4. 总结 Peter 的订单图中的处理值 非常感谢任何帮助。干杯 - rene
  • 请将此作为一个新问题提出。此外,您的链接控制台无法正常工作。看起来您有一组不必要的额外 CREATES,并且没有 MATCH 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多