Neo4jのCypherクエリでつながりの情報を取得する

Neo4jを最近触っています。Neo4jはグラフ型DBの一種でCypherという特殊なクエリでデータを取得できます。

Cypherムズい

で、このCypherは結構クセがあってむつかしい。たとえばme-(is friend of)-fooとかをCypherで取ってきたくても、クエリに慣れていないと「ノードしかとってこれない…」という悲しい思いをすることになります(なりました)。

Traversal使えば?

Neo4jにはCypherのほかにTraversalと呼ばれる「データをたどっていく」用途の機能もあります。本来はこちらを使えばいいのでしょうが、今回はちょっと制約があってCypherしか使えない、でもTraversalっぽいことをしたい…という状態でした。

おんなじような人がいた

で、StackOverflowをあさっていたらモロにおんなじような事を言っている人がいたので、ありがたくパクらせてもらいました。

たとえば上記の例でいくと、自分自身と接続するリレーションの情報、接続する相手の情報が以下のクエリ一発で取れます。

START me=node(1)
MATCH rel = me-[:is_friend_of]->friends
RETURN me, rel, friends

便利ですね :)