使用neo4j cypher在奥赛罗找到可翻转的路径

时间:2015-10-26 23:53:16

标签: neo4j cypher

使用图表

探索OTHELLO游戏逻辑

我是cypher的新手并且一直在将它用于othello棋盘游戏逻辑。我一直在研究一个cypher查询,它将返回用户可以选择作为下一步的图块。

Cypher下一步行动

MATCH (g:Game)-->(empty:Tile)
WHERE g.uuid=' ' AND empty.disc='none'
WITH empty
MATCH (empty)-[direction]->(t:Tile)
WHERE t.disc = 'black'
WITH empty, direction.compass as path
MATCH p=shortestPath( (empty)-[direct:DIRECTION *]->(lastNode) )
WHERE lastNode.disc = 'white' AND direct.compass = path
RETURN empty, direct.compass

我得到的错误是在倒数第二行

"WHERE lastNode.disc='white' AND direct.compass=path"

其中direct是关系的集合。我对这个集合并不感到惊讶,我想通过过滤罗盘属性来减少该集合,以确保所有关系都在同一方向。我该怎么做?

我认为上述逻辑试图完成的总结

我认为上面的代码将游戏板上的所有“空”牌作为开始。接下来,过滤到与黑色瓷砖相邻的空白瓷砖。使用空白到黑色的连接,我希望确保在找到结束白色图块时所有关系都在同一方向,以使路径可翻转。

游戏设置

CREATE (g:Game { uuid: " ", player_color: "white", turn_count: "-1" })
CREATE (t0:Tile { idx: toInt(0), disc: "none" })
// Where the tiles idx[0..63] are created
CREATE (g)-[:OWNS]->(t0)
// WHERE the game owns 64 tiles idx[0..63]
CREATE (t0)-[:DIRECTION {compass:'e'}]->(t1)
// compass: ['n','ne','e','se','s','sw','w','nw']
// one relationship per direction, only to neighbors, if applicable.
// The edge of the board and corners have a subset of these.

如果需要,我可以提供整个电路板创建密码。

1 个答案:

答案 0 :(得分:1)

  

我希望通过过滤罗盘属性来减少该集合   确保所有关系都朝着同一个方向。我该怎么办   是什么?

您正在寻找的是ALL谓词。所以你需要告诉路径p中的所有关系必须将属性罗盘赋予路径值:

WHERE ALL (x in rels(p) WHERE x.compass = path)

所以你的完整WHERE行将是

WHERE lastNode.disc='white' AND ALL (x in rels(p) WHERE x.compass = path)