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