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

时间:2018-07-06 00:00:55

标签: neo4j cypher

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

LOAD CSV WITH HEADERS FROM 'file:///xxx/test.csv' AS LINE
FIELDTERMINATOR ';'
MERGE (p:Position { FEN:LINE.FEN })

从FEN移到FEN,我想捕捉一些有关玩家动作以及游戏的细节。但是要做到这一点,我需要首先根据game和moveNumber排序数据。这是我的密码:

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})
      ))))

我收到的响应是Unbound Pattern !,我的翻译是“ neo4j在每种情况下都无法绑定pos1和pos2”。

为了测试这一点,我使用了MERGECREATE而不是CREATE UNIQUE,并且出于某种原因,两者都重新创建了所有Position节点。更糟糕的是,像每个image (recreated nodes and patterns)一样,为每个gID重新创建整个模式,而不是单个链。

如果有人可以指出我为什么会发生这种情况,或者向我提出替代方法,我将非常感激。我正在使用neo4j 2.3.5。

2 个答案:

答案 0 :(得分:1)

CREATE UNIQUEdeprecated,并且仅还不推荐使用的旧版Cypher“ Rule Planner”支持。旧规则规划器​​中可能有一些错误导致您的问题。

以下查询完善了@InverseFalcon指示的方法(将CREATE UNIQUE替换为3个MERGE),并通过消除所有的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;

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

答案 1 :(得分:0)

尝试使用3个MERGE,而不是单个CREATE UNIQUE。

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