Cypherの集合関数lastの挙動が変?
今日もぬこは激怒した。
Cypherの集合関数として、
- head
- tail
- last
があるのだが、何故かlastだけうまく動作しないときがある・・・。
headはOK。
neo4j-sh (0)$ START i=node(1) MATCH p=i-[:SCHEMA]->s-[r:META*0..]->n RETURN r, head(r); ==> +--------------------------------------------------------------------+ ==> | r | head(r) | ==> +--------------------------------------------------------------------+ ==> | [] | <null> | ==> | [:META[15] {}] | :META[15] {} | ==> | [:META[15] {},:META[16] {}] | :META[15] {} | ==> | [:META[13] {}] | :META[13] {} | ==> | [:META[13] {},:META[14] {}] | :META[13] {} | ==> | [] | <null> | ==> | [:META[10] {}] | :META[10] {} | ==> | [:META[10] {},:META[5] {}] | :META[10] {} | ==> | [:META[10] {},:META[5] {},:META[11] {}] | :META[10] {} | ==> | [:META[10] {},:META[5] {},:META[11] {},:META[7] {}] | :META[10] {} | ==> | [:META[10] {},:META[5] {},:META[8] {}] | :META[10] {} | ==> | [:META[10] {},:META[5] {},:META[8] {},:META[9] {}] | :META[10] {} | ==> | [:META[10] {},:META[5] {},:META[6] {}] | :META[10] {} | ==> | [:META[10] {},:META[5] {},:META[6] {},:META[7] {}] | :META[10] {} | ==> | [:META[4] {}] | :META[4] {} | ==> | [:META[4] {},:META[5] {}] | :META[4] {} | ==> | [:META[4] {},:META[5] {},:META[11] {}] | :META[4] {} | ==> | [:META[4] {},:META[5] {},:META[11] {},:META[7] {}] | :META[4] {} | ==> | [:META[4] {},:META[5] {},:META[8] {}] | :META[4] {} | ==> | [:META[4] {},:META[5] {},:META[8] {},:META[9] {}] | :META[4] {} | ==> | [:META[4] {},:META[5] {},:META[6] {}] | :META[4] {} | ==> | [:META[4] {},:META[5] {},:META[6] {},:META[7] {}] | :META[4] {} | ==> | [:META[1] {}] | :META[1] {} | ==> | [:META[1] {},:META[3] {}] | :META[1] {} | ==> +--------------------------------------------------------------------+ ==> 24 rows ==> 3 ms
tailもOK。
neo4j-sh (0)$ START i=node(1) MATCH p=i-[:SCHEMA]->s-[r:META*0..]->n RETURN r, tail(r); ==> +----------------------------------------------------------------------------------------------+ ==> | r | tail(r) | ==> +----------------------------------------------------------------------------------------------+ ==> | [] | [] | ==> | [:META[15] {}] | [] | ==> | [:META[15] {},:META[16] {}] | [:META[16] {}] | ==> | [:META[13] {}] | [] | ==> | [:META[13] {},:META[14] {}] | [:META[14] {}] | ==> | [] | [] | ==> | [:META[10] {}] | [] | ==> | [:META[10] {},:META[5] {}] | [:META[5] {}] | ==> | [:META[10] {},:META[5] {},:META[11] {}] | [:META[5] {},:META[11] {}] | ==> | [:META[10] {},:META[5] {},:META[11] {},:META[7] {}] | [:META[5] {},:META[11] {},:META[7] {}] | ==> | [:META[10] {},:META[5] {},:META[8] {}] | [:META[5] {},:META[8] {}] | ==> | [:META[10] {},:META[5] {},:META[8] {},:META[9] {}] | [:META[5] {},:META[8] {},:META[9] {}] | ==> | [:META[10] {},:META[5] {},:META[6] {}] | [:META[5] {},:META[6] {}] | ==> | [:META[10] {},:META[5] {},:META[6] {},:META[7] {}] | [:META[5] {},:META[6] {},:META[7] {}] | ==> | [:META[4] {}] | [] | ==> | [:META[4] {},:META[5] {}] | [:META[5] {}] | ==> | [:META[4] {},:META[5] {},:META[11] {}] | [:META[5] {},:META[11] {}] | ==> | [:META[4] {},:META[5] {},:META[11] {},:META[7] {}] | [:META[5] {},:META[11] {},:META[7] {}] | ==> | [:META[4] {},:META[5] {},:META[8] {}] | [:META[5] {},:META[8] {}] | ==> | [:META[4] {},:META[5] {},:META[8] {},:META[9] {}] | [:META[5] {},:META[8] {},:META[9] {}] | ==> | [:META[4] {},:META[5] {},:META[6] {}] | [:META[5] {},:META[6] {}] | ==> | [:META[4] {},:META[5] {},:META[6] {},:META[7] {}] | [:META[5] {},:META[6] {},:META[7] {}] | ==> | [:META[1] {}] | [] | ==> | [:META[1] {},:META[3] {}] | [:META[3] {}] | ==> +----------------------------------------------------------------------------------------------+ ==> 24 rows ==> 3 ms ==>
しかし、tailをかけると1件も返却されない・・・というより(0 rows)すら返ってないので、何か途中ですっこけてるのかも。
neo4j-sh (0)$ START i=node(1) MATCH p=i-[:SCHEMA]->s-[r:META*0..]->n RETURN r, last(r); neo4j-sh (0)$
last関数の結果として、リスト末端を返却する(空リストならnullを返す)のを期待していたのだが・・・
この関数の機能を当てにしてCypherクエリを作成していたのに、どうしてくれようか。
やっぱりバグなのかな?だとするとバグレポートを上げるべきだよなあ・・・。