GraphGists

Wikigame logo

维基百科游戏(或其任何变体,如“Wikirace”、“Wikispeedia”、“维基链游戏”或据称是原始的“点击到希特勒”)是一种在维基百科上玩的游戏。它主要受到世界各地枯燥课堂上的学生以及喜欢享受维基百科宏伟而混沌的美丽所带来的乐趣的人们的喜爱。

在此 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,这非常容易。例如,让我们在给定图上查找从“Angela Merkel”到“Apple Inc.”的所有最短路径

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

如我们所见,存在两条同样最短的路径,长度为4步。找到其中任何一条都将获得步数最高分(50分)。因此,我们实际上不需要所有路径。任何一条最短路径都足以与玩家结果进行比较。

那么,让我们看看从“Doctor Who”到“Microsoft”的最短路径,并为了方便,打印出此路径所需的步数

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

添加规则

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

作弊检测

如果我们跟踪玩家的步数,就可以检测出违反规则的尝试。只需将玩家的任何路径与图进行匹配,看看节点之间是否确实存在路径。因此,如果用户试图采取“非法捷径”,例如直接从“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",作者:版本1由Nohat(概念由Paullusmagnus提出);Wikimedia。遵循 CC BY-SA 3.0 许可协议

© . All rights reserved.