国际象棋棋盘
此 GraphGist 将展示如何设置一个丰富的连接的国际象棋棋盘,以便以后由启用 Neo4j 的应用程序使用。
让我们从基础开始。我们将创建一个经典的 8x8 国际象棋棋盘,如 维基百科文章 中所述。
创建文件
这些文件从白棋玩家的角度从左到右用字母 a 到 h 标记。因此,让我们创建八个 (:File) 节点,其属性为 {letter:<letter>},并使用 (:File)-[:RIGHT]→(:File) 关系将它们连接起来。
让我们看一下 (:File) 节点及其连接
MATCH (f:File) RETURN f
创建排
现在我们将创建八个排节点 (:Rank),编号从 1 到 8,其中 1 最靠近白棋玩家。排使用 (:Rank)-[:TOP]→(:Rank) 关系相互连接。
让我们看一下 (:Rank) 节点及其连接
MATCH (r:Rank) RETURN r
创建方格
由于已存在的 (:Rank) 和 (:File) 节点,创建 64 个 (:Square) 节点很容易。每个方格都链接到相应的排 (:Rank)←[:VERTICAL]-(:Square) 和列 (:File)←[:HORIZONTAL]-(:File)。此外,每个方格都继承了排和列节点的属性,并具有其自身的属性 {san},从 a1 到 h8,从而提供了称为 代数象棋记谱法 的标准记谱法。
让我们看一下 e4 方格节点 (:Square{san:'e4'}) 及其与相应排和列节点的连接
MATCH (r:Rank)<-[:VERTICAL]-(s:Square{san:"e4"})-[:HORIZONTAL]-(f:File) RETURN s,r,f
方格互连
现在,我们将棋盘上的方格用表示可能的棋子移动的关系连接起来。每个 (:Square)-[:HOP]-(:Square) 关系都具有 {type:<type>} 和 {length:<length>} 属性。
首先,我们创建所有可能的水平关系。国王、皇后和车等棋子可以向此方向移动。
让我们看一下水平连接的 d4 方格节点
MATCH (s:Square{san:'d4'})-[h:HOP{type:'horizontal'}]-(q:Square) RETURN s,q,h
以类似的方式,我们创建可能的垂直关系。国王、皇后、车和兵等棋子可以向此方向移动。
让我们看一下垂直连接的 c4 方格节点
MATCH (s:Square{san:'c4'})-[h:HOP{type:'vertical'}]-(q:Square) RETURN s,q,h
现在,我们可以利用现有的水平和垂直 [:HOP] 关系轻松地在方格之间创建对角线关系。国王、皇后、主教和兵等棋子可以向此方向移动。
让我们看一下对角线连接的 e5 方格节点
MATCH (s:Square{san:'e5'})-[h:HOP{type:'diagonal'}]-(q:Square) RETURN s,q,h
最后,我们需要为非常特殊的棋子——骑士创建 [:HOP] 关系。同样,我们将使用现有的水平和垂直 [:HOP] 关系来实现。
让我们看一下 d5 方格节点以及从中可能跳跃的骑士。我们不应该过多关注关系的方向,因为 Cypher 允许我们以两种方式构建查询。
MATCH (s:Square{san:'d5'})-[h:HOP{type:'knight'}]-(q:Square) RETURN s,q,h
有趣的部分
好的,我们现在有八个 (:Rank) 节点、八个 (:File) 节点和六十四个 (:Square) 节点,它们之间有许多不同的连接。我们如何使用它们来获得有价值的东西?
示例 1:让我们计算主教所有可能的移动次数。我们将查询所有具有 {type:'diagonal'} 属性的 [:HOP] 关系。由于棋盘上有两个主教(浅色方格和深色方格),我们需要将总数除以二。请注意,我们没有指定关系方向,以考虑相反方向的移动,例如 a1h8 和 h8a1。
MATCH (s:Square)-[h:HOP{type:'diagonal'}]-(q:Square) RETURN count(h)/2
示例 2:以下是获取皇后从 e4 方格的所有可能的移动的查询。它将首先显示最长的移动。总共有 27 种可能的移动方式。这就是为什么棋盘中心的皇后是最强大的棋子。
MATCH (s:Square{san:'e4'})-[h:HOP]-(q:Square) WHERE h.type <> 'knight' RETURN s.san+q.san, h.type, h.length ORDER BY h.length DESC
示例 3:找到从 a1 到 h8 方格的最短骑士巡回路线。骑士需要六步才能到达棋盘的另一侧。
MATCH p=(s:Square{san:"a1"})-[:HOP*..6{type:"knight"}]-(b:Square{san:"h8"}) WITH p,nodes(p) AS n LIMIT 1 UNWIND n as nodes RETURN length(p),collect(nodes.san)
显然,这些只是一些简单的示例,但可以使用 Cypher 和图论的强大功能构建更复杂的查询。此图中描述的棋盘可以用作其他与棋相关的图的基本组成部分。
我真的很想收到任何反馈。如果您发现错误、有建议或意见,请随时告诉我。
此 gist 由 Andrey Tutolmin 创建
此页面是否有帮助?