Time 如何找到在一定时间范围内发生的一系列事务?

Time 如何找到在一定时间范围内发生的一系列事务?,time,neo4j,cypher,Time,Neo4j,Cypher,我有一个数据集,其中的节点是通过事务链接的公司 公司有以下属性:名称、国家、类型、创建日期 关系“销售对象”具有以下属性:项目、日期、金额 所有日期均采用以下格式YYYYMMDD 我试图找到一系列的交易: -包括来自2个不同国家的2家公司 -其中,在系列中的第一个节点和最后一个节点之间,存在一家创建时间不到90天前的公司 -第一笔交易和最后一笔交易之间的总时间(b:公司)-[v:出售给*]->(c:公司) 其中不包括(a.国家=c.国家)和(b.创建日期+90(c:公司) a.c.country

我有一个数据集,其中的节点是通过事务链接的公司

公司有以下属性:名称、国家、类型、创建日期

关系“销售对象”具有以下属性:项目、日期、金额

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

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

我想我能应付情况1)和2),但我被困在3)上了

匹配(a:公司)-[r:出售给]->(b:公司)-[v:出售给*]->(c:公司)
其中不包括(a.国家=c.国家)和(b.创建日期+90<20140801)
基本上,我不知道如何获得该系列中最后一笔交易的日期。有人知道怎么做吗?

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
匹配p=(a:公司)-[rs:出售给*]->(c:公司)
a.c.country在哪里
将p、a、c、rs、节点(p)作为ns
将p、a、c、rs、过滤器(n在ns中,其中n.创建日期-20140801<90)作为bs
以p、a、c、rs、头部(bs)作为b
其中NOT b为NULL
p,a,b,c,头部(rs)为r1,最后(rs)为rn
带p、a、b、c、r1、rn、rn.date-r1.date为d
其中d<15
返回a、b、c、d、r1、rn
此查询查找一个链,其中至少有一个:salls_TO:Company节点之间的关系,并将匹配的路径分配给“p”。然后,匹配仅限于第一家和最后一家公司所在国家不同的情况。此时WITH子句将开发您需要的其他元素。获取路径中的节点集合并命名为“ns”。由此,可以找到创建日期距离目标日期不到90天的节点集合,并将其命名为“bs”。然后找到“bs”集合的第一个节点并将其命名为“b”,匹配仅限于找到“b”节点的情况。然后找到第一个和最后一个关系,并将其命名为“r1”和“rn”。在此之后,计算日期差异并命名为“d”。然后,匹配仅限于d小于15的情况

这就给了你一个方法。不过,还有另一个问题。至少,按照您描述问题的方式,您会发现日期数学将失败。以数字表示的日期(如20140801)不是线性的,因此不能用于区间数学。例如,从20140820开始的15天是20140904。如果你减去这两个日期“数字”,你会得到84。如何做到这一点的一个例子是将日期表示为自纪元日期起的天数

恩典与和平

吉姆

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