我正在加载一个国际象棋数据集,其中在字符串(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”。
为了测试这一点,我使用了MERGE
和CREATE
而不是CREATE UNIQUE
,并且出于某种原因,两者都重新创建了所有Position节点。更糟糕的是,像每个image (recreated nodes and patterns)一样,为每个gID重新创建整个模式,而不是单个链。
如果有人可以指出我为什么会发生这种情况,或者向我提出替代方法,我将非常感激。我正在使用neo4j 2.3.5。
答案 0 :(得分:1)
CREATE UNIQUE
是deprecated,并且仅还不推荐使用的旧版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;
在此查询中,我还假设gId
和moveNumber
属性足以识别同一对位置之间的唯一MOVE
关系。
答案 1 :(得分:0)
尝试使用3个MERGE,而不是单个CREATE UNIQUE。
合并pos1,然后合并pos2,然后合并它们之间的关系。