メイン DB が Neo4j であるソーシャル トリビア ゲームを開発しています。特定のユースケースで苦労しています。
関連する 2 つの Opponents ノードを持つ Challenge ノードがあります。
(opponent1)-[:OPPONENT]->(challenge)<-[:OPPONENT]-(opponent2)
課題はサブジェクト ノードに関連しています。
challenge-[:subject]->subject
各主題は多くの質問に関連しています。
subject-[:HAS]->question
以下の関係が存在する前に対戦相手が特定の質問に答えた場合:
opponent-[:ANSWER]->question
ユースケース:チャレンジのために X 個の質問 (どちらの対戦相手も回答していない) を取得する必要があります
次の Cypher クエリがあります。
START challenge=node({0}) , subject=node({1})
MATCH (opponent1)-[:OPPONENT]->(challenge)<-[:OPPONENT]-(opponent2)
WITH opponent1,opponent2,subject
MATCH (subject)-[:HAS]->(question)
WHERE length(opponent1-[:ANSWER]->question) = 0 and length(opponent2-[:ANSWER]->question) = 0
return question limit {2}
上記のクエリは正常に機能し、チャレンジの可能な質問を取得します。
問題は、質問がランダムではなく結果として取得されることです。
説明:カテゴリ プロパティを持つテンプレート ノードに関連する各質問。
question-[:TEMPLATE]->template
テンプレートによって最初に作成された質問は、特定のカテゴリからのすべての質問が DB 内で ID をシーケンスしていることを意味するため、上記のクエリは同じカテゴリから質問を取得します。
チャレンジ問題をランダムに取得できるようにしたい。また、クエリ構造はパフォーマンスの観点から正しいですか?