Neo4j无法绑定FOREACH中已经存在的节点

Neo4j无法绑定FOREACH中已经存在的节点,neo4j,cypher,Neo4j,Cypher,我正在加载一个国际象棋数据集,其中一个棋盘的“快照”被打印在一个字符串(FEN)中。首先,我使用FENs上的merge获得所有唯一位置,如下所示: LOAD CSV WITH HEADERS FROM 'file:///xxx/test.csv' AS LINE FIELDTERMINATOR ';' MERGE (p:Position { FEN:LINE.FEN }) 从一个分到另一个分,我想捕捉一些关于玩家移动和游戏的细节。但要做到这一点,我需要首先根据游戏和移动号码订购数据。这是我的密

我正在加载一个国际象棋数据集,其中一个棋盘的“快照”被打印在一个字符串(FEN)中。首先,我使用FENs上的merge获得所有唯一位置,如下所示:

LOAD CSV WITH HEADERS FROM 'file:///xxx/test.csv' AS LINE
FIELDTERMINATOR ';'
MERGE (p:Position { FEN:LINE.FEN })
从一个分到另一个分,我想捕捉一些关于玩家移动和游戏的细节。但要做到这一点,我需要首先根据游戏和移动号码订购数据。这是我的密码:

LOAD CSV WITH HEADERS FROM 'file:///xxx/test.csv' AS LINE
FIELDTERMINATOR ';'
WITH LINE.FEN as FEN,LINE.GameNumber as gn,LINE.MoveNumber as mn,LINE.Side as side,LINE.Move as move
order by gn,mn
WITH COLLECT({FEN:FEN,gID:gn,moveNumber:mn,Side:side,Move:move}) as col
FOREACH(i in RANGE(0, length(col)-2)|
  FOREACH(ps1 in [col[i]] | 
    FOREACH(ps2 in [col[i+1]] |
        FOREACH (ignore in CASE
          WHEN ps1.gID = ps2.gID THEN [1]
          ELSE [] END |
            CREATE UNIQUE (pos1: Position{FEN: ps1.FEN})-[:MOVE{gID:ps2.gID,moveNumber:ps2.moveNumber,Side:ps2.Side,Move:ps2.Move}]->(pos2: Position{FEN: ps2.FEN})
      ))))
我收到的响应是
未绑定模式,我翻译为“neo4j在每种情况下都无法绑定pos1和pos2”

为了验证这一点,我使用了
MERGE
CREATE
而不是
CREATE UNIQUE
,出于某种原因,这两种方法都重新创建了所有位置节点。更糟糕的是,正在为每个gID重新创建整个模式,而不是单链,如图所示


如果有人能告诉我为什么会发生这种情况,或者给我一个替代方法,我会非常感激。我正在使用neo4j 2.3.5。

尝试使用3个合并,而不是单个创建唯一


合并pos1,然后合并pos2,然后合并它们之间的关系。

CREATE UNIQUE
仅由同样不推荐的旧密码“Rule Planner”支持。旧的规则规划器中可能有一些错误导致您的问题

下面的查询充实了@InverseFalcon指示的方法(用3个
MERGE
s替换
CREATE UNIQUE
),并通过消除所有
FOREACH
循环简化了查询结构

LOAD CSV WITH HEADERS FROM 'file:///xxx/test.csv' AS LINE FIELDTERMINATOR ';'
WITH LINE
ORDER BY LINE.GameNumber, LINE.MoveNumber
WITH COLLECT({FEN: LINE.FEN, gID: LINE.GameNumber, mn: LINE.MoveNumber, Side: LINE.Side, Move: LINE.Move}) as col
UNWIND [i IN RANGE(0, SIZE(col)-2) WHERE col[i].gID = col[i+1].gID | {p1: col[i], p2: col[i+1]}] AS x
MERGE (pos1: Position {FEN: x.p1.FEN})
MERGE (pos2: Position {FEN: x.p2.FEN})
MERGE (pos1)-[m:MOVE {gID: x.p2.gID, moveNumber: x.p2.mn}]->(pos2)
ON CREATE SET m.Side = x.p2.Side, m.Move = x.p2.Move;

在这个查询中,我还假设
gId
moveNumber
属性足以识别同一对位置之间唯一的
MOVE
关系。

非常感谢。我接受你的回答,因为你给了我一个更干净的解决方案。你关于移动关系唯一性的假设是正确的。非常感谢你的投入。在你回答之前,我就明白了。但是,我没有在开始时尝试合并,而是在foreach子句中合并了所有内容。我感谢你花时间帮助我!