我有一组测试w,x,y和z的测试结果,它们是在不同的样品上独立测量的。测试结果创建了样本的分层组装。
因此,您有一个查询在每个结果行中生成一个列表,例如:
row1: w, [13,5,16,21,11,19]
row2: x, [5,16,19]
row3: y, [5,19]
row4: z, [19]
可以使用以下方法创建:
create (a:test{name:'w'})
create (b:test{name:'x'})
create (c:test{name:'y'})
create (d:test{name:'z'})
create (e:sample{number:13})
create (f:sample{number:5})
create (g:sample{number:16})
create (h:sample{number:21})
create (i:sample{number:11})
create (j:sample{number:19})
merge (a)-[:result{value:'+'}]->(e)
merge (a)-[:result{value:'+'}]->(f)
merge (a)-[:result{value:'+'}]->(g)
merge (a)-[:result{value:'+'}]->(h)
merge (a)-[:result{value:'+'}]->(i)
merge (a)-[:result{value:'+'}]->(j)
merge (b)-[:result{value:'+'}]->(f)
merge (b)-[:result{value:'+'}]->(g)
merge (b)-[:result{value:'+'}]->(j)
merge (c)-[:result{value:'+'}]->(f)
merge (c)-[:result{value:'+'}]->(j)
merge (d)-[:result{value:'+'}]->(j)
merge (d)-[:result{value:'-'}]->(f)
然后,查询可能是:
match (t:test)-[r:result]->(s:sample)
return t.name,collect(s.number + r.value) as results
order by size(results) desc
样本项在每一行都会丢失,因为测量参数(w,x,y,z)从+变为 - 或者为null。但我需要区分负值和缺少数据(null)。我想验证第3行中的w +,5变为y-,第4行变为5,而不是第4行中的样本5变为空。由于缺少数据,样本16退出,而y为负面结果。
如果样本数量很少,这将很容易:
match (t:test)-[r:result]->(s:sample)
return t.name,
collect(case when r.value='+' then s.number + r.value else null end) as results,
collect(case when r.value='-' then s.number + r.value else null end) as neg_result
order by size(results) desc
,但在我的场景中,样本量非常大,传播整个列表会很混乱。
因此,问题是:有没有办法使用cypher解决前一行的列表,在下一行中提出问题?