0

メイン 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 をシーケンスしていることを意味するため、上記のクエリは同じカテゴリから質問を取得します。

チャレンジ問題をランダムに取得できるようにしたい。また、クエリ構造はパフォーマンスの観点から正しいですか?

4

1 に答える 1

1

私はランダムな結果を得る方法のネイティブな方法を認識していません.smtingはすでにここでそれについて尋ねられています.neo4j :ランダムなノードを選択する方法/方法はありますか?

クエリについては、データに依存しますが、むしろこれを試してみます:

START challenge=node({0}) , subject=node({1})
MATCH (opponent1)-[:OPPONENT]->(challenge)<-[:OPPONENT]-(opponent2)
WITH opponent1,opponent2,subject
MATCH (subject)-[:HAS]->(question)
WHERE not(opponent1-[:ANSWER]->question) and not (opponent2-[:ANSWER]->question)
return question limit {2} 
于 2013-04-04T08:41:39.533 に答える