3

Cypher で Neo4J を使用する

本質的にユーザーの「壁」を取得しようとしています。このウォールには、あなた、あなたの友人による投稿、および投稿コメントがあります。

これまでの私のクエリは次のとおりです。

match (a:Account)-[:FRIEND*0..1]->(friend:Account)-[:POST]->(post:Post)
where a.uid = "u132984734sas"
optional match (post)<-[:COMMENT*0..1]-(comment:Comment)<-[:AUTHOR]-(commentAuthor:Account)
return friend,post,comment,commentAuthor
ORDER BY post.date_created DESC
LIMIT 10

注意してくださいLIMIT 10

まあ、私はこれを半分予想していましたが、PHP の Doctrine が入れ子になった配列をフェッチするときと同じように、トップレベルの投稿と、投稿内の各コメントに対する 1 つのコメントを特徴とする行が返されます。

LIMITつまり、コメントを取得せずにこの基準に一致する投稿が 20 件ある場合、基準のおかげで 10 件の実際の投稿が返さ
れます。最初の 10 件の結果内の 1 件の投稿に 2 件のコメントが含まれているとします。 10 件ではなく 9 件の投稿を取り上げます。最初のコメントは、利用可能な場合は常に最初の行に返されるため、resultSet によって返される数を損なうことはありませんが、投稿ごとに追加のコメントがあるたびに減ります。

ここで信頼できる10の結果を得たいのですが、ここで何をすべきかわかりません。

簡潔にするために、私はEveryman\Neo4JPHPを使用しています

50 件の投稿に対してクエリを実行し、上位 10 件の結果のみを選択してプルーニングすることも考えましたが、これは明らかに正しくないようです (笑)

4

1 に答える 1

1

これは、@FrobberOfBitsが質問へのコメントで提案したもののわずかなバリエーションです。

集計を使用する場合、2 つのコレクション ( 用commentと 用commentAuthor) を作成する代わりに、要素がcommentと のcommentAuthorペアである単一のコレクションを作成できます。

MATCH (a:Account)-[:FRIEND*0..1]->(friend:Account)-[:POST]->(post:Post)
WHERE a.uid = "u132984734sas"
OPTIONAL MATCH (post)<-[:COMMENT*0..1]-(comment:Comment)<-[:AUTHOR]-(commentAuthor:Account)
RETURN friend,post, COLLECT({comment: comment, commentAuthor: commentAuthor}) AS comments
ORDER BY post.date_created DESC 
LIMIT 10
于 2015-08-14T17:57:42.487 に答える