如何在一段时间内找到一系列交易?

时间:2014-08-02 14:26:16

标签: time neo4j cypher

我有一个数据集,其节点是按交易链接的公司。

公司具有以下属性:name,country,type,creation_date

关系“SELLS_TO”具有以下属性:项目,日期,金额

所有日期均采用以下格式YYYYMMDD。

我正在尝试找到一系列交易: - 包括来自2个不同国家的2家公司 - 在系列中的第一个节点和最后一个节点之间,有一家公司在不到90天前创建 - 第一次交易和最后一次交易之间的总时间是< 15天

我认为我可以处理条件1)和2)但我坚持3)。

MATCH (a:Company)-[r:SELLS_TO]->(b:Company)-[v:SELLS_TO*]->(c:Company)
WHERE NOT(a.country = c.country) AND (b.creation_date + 90 < 20140801)

基本上我不知道如何获取系列中最后一笔交易的日期。谁知道怎么做?

1 个答案:

答案 0 :(得分:2)

jvilledieu,

在回答您最直接的问题时,您可以访问匹配路径中的节点和关系集合,并获取所需的信息。查询看起来像这样。

MATCH p=(a:Company)-[rs:SELLS_TO*]->(c:Company)
WHERE a.country <> c.country
WITH p, a, c, rs, nodes(p) AS ns
WITH p, a, c, rs, filter(n IN ns WHERE n.creation_date - 20140801 < 90) AS bs
WITH p, a, c, rs, head(bs) AS b
WHERE NOT b IS NULL
WITH p, a, b, c, head(rs) AS r1, last(rs) AS rn
WITH p, a, b, c, r1, rn, rn.date - r1.date AS d
WHERE d < 15
RETURN a, b, c, d, r1, rn

此查询找到一个链:在公司节点之间至少有一个:SELLS_TO关系,并将匹配的路径分配给&#39; p&#39;。这场比赛仅限于第一家和最后一家公司有不同国家的情况。此时,WITH子句开发了您需要的其他元素。获取路径中的节点集合并命名为&#39; ns。由此,找到创建日期距目标日期不到90天的节点集合,并命名为“bs&#39;”。 &#39;&#39;的第一个节点然后找到并命名为&#39; b&#39;,并且匹配仅限于&#39; b&#39;找到了节点。然后找到第一个和最后一个关系并命名为&#39; r1&#39;并且&#39;。在此之后,计算其日期的差异并命名为&#39; d&#39; d。然后匹配限于d小于15的情况。

这样可以让您了解如何执行此操作。但是还有另一个问题。至少,在您描述问题的方式中,您会发现日期数学将失败。表示为数字的日期(例如20140801)不是线性的,因此不能用于区间数学。例如,从20140820开始的15天是20140904.如果您减去这两个日期&#39;,您将获得84.如何执行此操作的一个示例是将您的日期表示为自纪元日期以来的天数。< / p>

恩典与和平,

吉姆