Cypherにおけるdistinctとorder byの併用
そしてぬこは途方に暮れた。
CypherのRETURN句には、distinctの指定とorder byの指定がある。
order byの例
neo4j-sh (0)$ START i=node(1) MATCH p=i-[:SCHEMA]->s-[r:META*0..]->n RETURN n.name order by n.name ; ==> +-----------+ ==> | n.name | ==> +-----------+ ==> | "integer" | ==> | "string" | ==> | "string" | ==> | "string" | ==> | "string" | ==> | "string" | ==> | "string" | ==> | "string" | ==> | "string" | ==> | "カラム" | ==> | "カラム" | ==> | "カラムlist" | ==> | "カラムlist" | ==> | "カラム名" | ==> | "カラム名" | ==> | "カラム名" | ==> | "カラム名" | ==> | "テーブル名" | ==> | "テーブル定義書" | ==> | "データ型" | ==> | "データ型" | ==> | "処理定義書" | ==> | "参照テーブル" | ==> | "機能番号" | ==> +-----------+ ==> 24 rows ==> 0 ms
distinctの例
neo4j-sh (0)$ START i=node(1) MATCH p=i-[:SCHEMA]->s-[r:META*0..]->n RETURN distinct n.name ; ==> +-----------+ ==> | n.name | ==> +-----------+ ==> | "処理定義書" | ==> | "参照テーブル" | ==> | "string" | ==> | "機能番号" | ==> | "integer" | ==> | "テーブル定義書" | ==> | "カラムlist" | ==> | "カラム" | ==> | "カラム名" | ==> | "データ型" | ==> | "テーブル名" | ==> +-----------+ ==> 11 rows ==> 3 ms
ここまでは良い。この挙動をみたら、distinctした結果をorder by したくなるわけで、それをやってみると
neo4j-sh (0)$ START i=node(1) MATCH p=i-[:SCHEMA]->s-[r:META*0..]->n RETURN distinct n.name order by n.name; ==> SyntaxException: Unknown identifier `n`. neo4j-sh (0)$
は?(威圧)
いやいやいや、ドキュメント上はdistinctとorder byの併用は不可という記述はないように思えたんだけど・・・。
大体、"Unknown identifier `n`."ってどういうことよ?
MATCH句にきちんと書いてあるじゃないか。
さらに奇妙なことに、distinct対象がプロパティではなく、nodeだとdistinctもorder byも併用できる。
neo4j-sh (0)$ START i=node(1) MATCH p=i-[:SCHEMA]->s-[r:META*0..]->n RETURN distinct n order by n.name; ==> +---------------------------------------------+ ==> | n | ==> +---------------------------------------------+ ==> | Node[12]{type:"meta_value",name:"integer"} | ==> | Node[5]{type:"meta_value",name:"string"} | ==> | Node[7]{type:"meta_complex",name:"カラム"} | ==> | Node[6]{type:"meta_complex",name:"カラムlist"} | ==> | Node[8]{type:"meta_simple",name:"カラム名"} | ==> | Node[3]{type:"meta_simple",name:"テーブル名"} | ==> | Node[2]{type:"meta_complex",name:"テーブル定義書"} | ==> | Node[9]{type:"meta_simple",name:"データ型"} | ==> | Node[10]{type:"meta_complex",name:"処理定義書"} | ==> | Node[13]{type:"meta_simple",name:"参照テーブル"} | ==> | Node[11]{type:"meta_simple",name:"機能番号"} | ==> +---------------------------------------------+ ==> 11 rows ==> 0 ms
何コレ?