国际象棋棋盘
此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
创建方格节点
创建64个 (:Square) 节点很容易,这得益于现有的 (:Rank) 和 (:File) 节点。每个方格都链接到对应的横行 (: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 创建
此页面有帮助吗?