0

我正在开发某种社交琐事游戏,我的主要数据库是 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,因此上述查询检索来自同一类别的问题。

我希望能够随机检索挑战问题。此外,从性能角度来看,查询结构是否正确?

4

1 回答 1

1

我不知道如何获得随机结果的本地方式,这里已经有 smting 询问过: neo4j: Is there a way/how to select random nodes?

关于查询,取决于数据,但我宁愿尝试这样:

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 回答