我正在开发某种社交琐事游戏,我的主要数据库是 Neo4j。我在特定的用例中遇到了困难。
我有 Challenge 节点,其中有两个 Opponents 节点相关:
(opponent1)-[:OPPONENT]->(challenge)<-[:OPPONENT]-(opponent2)
挑战与主题节点有关:
challenge-[:subject]->subject
每个主题都涉及许多问题:
subject-[:HAS]->question
如果对手在以下关系存在之前回答了特定问题:
opponent-[:ANSWER]->question
用例:我需要为挑战检索 X 个问题(两个对手都没有回答过)
我有以下密码查询:
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
首先由模板创建的问题,这意味着来自特定类别的所有问题在数据库中都有序列 ID,因此上述查询检索来自同一类别的问题。
我希望能够随机检索挑战问题。此外,从性能角度来看,查询结构是否正确?