私が取り組んでいるこのソーシャル ネットワーク タイプのアプリケーション用の Cypher クエリを作成しようとしています。他のユーザーをフォローしているユーザーがいて、ユーザーが投稿を書き、いいね/共有できる Facebook タイプのアプリケーションを考えてみてください。
ユーザー Alice が数人のユーザー (サブジェクト) をフォローしているとします。
クエリが返す必要があるのは、次の 3 つです。
- アリスの主題によって作成された投稿
- Alice のサブジェクトがいいね! をした投稿 (いいね! の数が 5 以上)
- Alice のサブジェクトによって共有された投稿 (共有数 >= 5)
3 つのクエリを個別に記述できます。
start alice=node(35500)
match (alice)-[:FOLLOWS]->()-[:SHARES]->(post)
where not((post)-[:ORIGINAL]->())
return post;
start alice=node(35500)
match (alice)-[:FOLLOWS]->()-[:LIKES]->(post)
with post, count(post) as likes
where likes >= 5
return post;
start alice=node(35500)
match (alice)-[:FOLLOWS]->()-[:SHARES]->(post)-[repost:ORIGINAL]->()
with post, count(repost) as reposts
where reposts >= 5
return post;
(再投稿には、元の投稿との :ORIGINAL 関係があります)
現時点では、3 つのクエリを個別に実行し、クライアントで結果を組み合わせ、並べ替え、ページングしています。私が本当に欲しいのは、SKIP と LIMIT で結果をページングできる単一のクエリです。
私が知る限り、UNION は私が使用している (安定した) バージョンである Neo4j 1.9 ではサポートされていません。不安定な Neo4j 2.0 へのアップグレードは、実際にはオプションではありません。
Neo4j の UNION なしでこれを行う方法はありますか?
ありがとう!