GraphGists

Wikigame logo

维基百科游戏,或其任何变种,如“维基竞速”、“维基百科加速赛”、“维基链接游戏”,或据称最初的“点击希特勒”,是一款在维基百科上玩的游戏。它主要受到全世界无聊课堂上的学生以及所有喜欢在维基百科这个壮丽而混乱的美妙世界中寻找乐趣的人们的喜爱。

在这个gist中,我提出一个概念,使用Neo4j服务器作为这个游戏的引擎。要实际构建它,您还需要提供一个前端,可以提供一些游戏界面、维基百科页面并执行Cypher查询,这些将在以下部分中进行描述。

游戏规则

玩家从一个随机选择的维基百科页面开始,并且必须仅通过点击当前文章中的链接来导航到另一个给定的页面(首页)。目标是以最少的点击次数(步骤)和最短的时间到达首页。

根据步数和时间,将为玩家授予积分。一个可能的公式如下所示

wikiPoints

因此,一轮游戏可能的结果如下所示

wikiplayer

OPTIMALBOT用于比较,并显示本轮游戏中获得最高分数的参数。我还建议使用一些最大时间限制,以保证游戏的公平性。

数据模型:由Neo4j驱动的游戏

Links

如该图像所示,游戏所需的数据模型非常简单。为了找到两个文章页面之间的最短路径,我们只需要考虑页面以及它们之间的链接。除了标题用于识别页面之外,我们不需要关于页面的任何其他信息。

幸运的是,Mirko Nasato提供了graphipedia项目,用于从维基百科转储文件生成Neo4j数据库,完全符合所需的数据模型。

导入图

从维基百科转储文件使用graphipedia生成,这是一个英文维基百科的示例(子)图。为了使这个示例保持可管理的大小(对于一个gist),我选择限制示例中节点和关系的数量。

请注意,维基百科转储文件需要与您想要在其上玩游戏的维基百科版本相对应。否则,实时版本上可能存在缺少或额外的链接/页面,而您的系统对此一无所知。如果您选择在旧版本的转储文件上玩游戏,您可能需要自己托管该版本。

因此,现在我们有了图,让我们看看如何使用它

选择开始和结束页面

首先,我们需要两个随机选择的页面:一个开始页面和一个结束页面。以下简单的查询将为我们提供两个页面。

MATCH (node:Page)
WITH node, rand() AS number
RETURN node.title as Pages
ORDER BY number
LIMIT 2

计算最优路径

为了检查两个页面之间是否存在路径(如果没有,则选择两个新的随机页面),更重要的是,评估玩家的表现,我们需要知道从随机开始页面到结束页面的最短路径的长度。使用Cypher,这非常容易。例如,让我们在给定的图上找到从“安格拉·默克尔”到“苹果公司”的所有最短路径

MATCH paths = allShortestPaths((a:Page { title:'Angela Merkel' })-[:Link*]->(b:Page { title:'Apple Inc.' }))
RETURN paths

正如我们所看到的,有两条长度相同的最小路径,长度为4步。找到其中任何一条路径都将获得步数方面的最高分数(50)。因此,我们并不真正需要所有路径。任何最短路径都足以与玩家结果进行比较。

所以让我们看看从“神秘博士”到“微软”的最短路径,为了方便起见,打印出此路径所需的步数

MATCH path = shortestPath((a:Page { title:'Doctor Who' })-[:Link*]->(b:Page { title:'Microsoft' }))
RETURN path, length(path) as Steps

添加规则

添加其他规则也很简单。例如,如果我们想添加一个规则,例如“不要使用国家”,则有两种方法。第一种是丰富数据集,以便表示国家的节点将获得一个“国家”标签。然后,可以从数据库中删除这些节点,或者需要更改查询以忽略这些国家页面。第二种方法是手动删除它们,对于国家来说,这可以相当快地完成,但是如果您想要从游戏中删除诸如城市之类的其他内容,您可能需要自动执行此任务。

作弊检测

如果我们跟踪玩家的步骤,我们可以检测违规尝试。只需将玩家的任何路径与图进行匹配,并查看节点之间是否确实存在路径。因此,如果用户尝试采取“非法捷径”,例如直接从“ASP.NET”到“.NET”,则检查其路径的查询,例如

OPTIONAL MATCH path = (a:Page { title:'ASP.NET' })-[:Link]->(b:Page { title:'.NET' })
RETURN
CASE
WHEN path is null THEN false
ELSE true
END AS ValidPath

将发现作弊的玩家,而像从“.NET Framework”到“C++”这样的有效步骤则可以被验证

OPTIONAL MATCH path = (a:Page { title:'.NET Framework' })-[:Link]->(b:Page { title:'C++' })
RETURN
CASE
WHEN path is null THEN false
ELSE true
END AS ValidPath

关于

由Sascha Peukert创建

"Wikipedia-logo-v2",作者:Nohat版本1(概念由Paullusmagnus提供);维基媒体。根据CC BY-SA 3.0许可