Neo4j Cypher中查询的透视表类型(在一次过程中)
我试图一次性执行以下查询,但我认为这是不可能的,而且会导致某种形式的“嵌套”结构,这在性能方面从来都不是好消息 不过,我可能遗漏了一些东西,所以我想我可能会问 底层数据结构是两个实体之间的多对多关系Neo4j Cypher中查询的透视表类型(在一次过程中),neo4j,cypher,query-performance,Neo4j,Cypher,Query Performance,我试图一次性执行以下查询,但我认为这是不可能的,而且会导致某种形式的“嵌套”结构,这在性能方面从来都不是好消息 不过,我可能遗漏了一些东西,所以我想我可能会问 底层数据结构是两个实体之间的多对多关系AB 最终目标是获得实体B的对象在特定时间间隔内分配给实体A的对象的次数(占总分配的百分比) 正是问题的后一部分引起了头痛 实体A包含一个item\u date字段 实体B包含一个item\u类别字段 结果的表示可以扩展为一个表格,其列为不同的项目_日期,行为不同的项目_类别标准化计数。我只是为了清楚
AB
最终目标是获得实体B
的对象在特定时间间隔内分配给实体A
的对象的次数(占总分配的百分比)
正是问题的后一部分引起了头痛
实体A
包含一个item\u date
字段
实体B
包含一个item\u类别
字段
结果的表示可以扩展为一个表格,其列为不同的项目_日期
,行为不同的项目_类别
标准化计数。我只是为了清楚起见才提到这一点,查询不必以那种确切的形式返回结果
我的尝试:
with 12*30*24*3600 as window_length, "1980-1-1" as start_date,
"1985-12-31" as end_date
unwind range(apoc.date.parse(start_date,"s","yyyy-MM-dd"),apoc.date.parse(end_date,"s","yyyy-MM-dd"),window_length) as date_step
match (a:A)<-[r:RELATOB]-(b:B)
where apoc.date.parse(a.item_date,"s","yyyy-MM-dd")>=date_step and apoc.date.parse(a.item_date,"s","yyyy-MM-dd")<(date_step+window_length)
with window_length, date_step, count(r) as total_count unwind ["code_A", "code_B", "code_C"] as the_code [MATCH THE PATTERN AGAIN TO COUNT SPECIFIC `item_code` this time.
窗口长度为12*30*24*3600,开始日期为1980-1-1,
“1985-12-31”作为结束日期
展开范围(apoc.date.parse(开始日期,“s”,“yyyy-MM-dd”)、apoc.date.parse(结束日期,“s”,“yyyy-MM-dd”)、窗口长度)作为日期步骤
match(a:a)=date_step和apoc.date.parse(a.item_date,“s”,“yyyy-MM-dd”)Tomaz Bratanic在评论中提出的解决方案(我认为)大致如下:
with 1*30*24*3600 as window_length,
"1980-01-01" as start_date,
"1985-12-31" as end_date
unwind range(apoc.date.parse(start_date,"s","yyyy-MM-dd"),apoc.date.parse(end_date,"s","yyyy-MM-dd"),window_length) as date_step
unwind ["code_A","code_B","code_c"] as the_code
match (a:A)<-[r:RELATOB]-(b:B)
where apoc.date.parse(a.item_date,"s","yyyy-MM-dd")>=date_step and apoc.date.parse(a.item_category,"s","yyyy-MM-dd")<(date_step+window_length)
return the_code, date_step, tofloat(sum(case when b.item_category=code then 1 else 0 end)/count(r)) as perc_count order by date_step asc
这也是它的执行计划:
最初的双人比赛大约55790ms,一次完成(比赛前两次都展开)82306ms,一次完成(比赛后第二次展开)23461ms我通常如何进行“旋转”如下。。。求和(当x=y,然后1,否则0结束)作为结果,然后做几步感谢@TomažBratanič,我想我得到了这个解决方案的样子。我要举一个稍微复杂一点的例子。@TomažBratanič你拿饼干。如果你写这封信作为回答,我还是会接受的。无论如何,非常感谢你。
with 1*30*24*3600 as window_length,
"1980-01-01" as start_date,
"1985-12-31" as end_date
unwind range(apoc.date.parse(start_date,"s","yyyy-MM-dd"),apoc.date.parse(end_date,"s","yyyy-MM-dd"),window_length) as date_step
match (a:A)<-[r:RELATOB]-(b:B)
where apoc.date.parse(a.item_date,"s","yyyy-MM-dd")>=date_step and apoc.date.parse(a.item_category,"s","yyyy-MM-dd")<(date_step+window_length)
unwind ["code_A","code_B","code_c"] as the_code
return the_code, date_step, tofloat(sum(case when b.item_category=code then 1 else 0 end)/count(r)) as perc_count order by date_step asc