【发布时间】: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函数的文档在哪里?