rels: [{"nodeid":14, "direction":false}, {"nodeid":15, "direction":true}]
我想創建所創建的節點,並與相應的方向上的給定的節點之間的關係:
CREATE (n) WITH n
UNWIND {rels} AS rel
MATCH (p) WHERE ID(p)=rel.nodeid
WITH n, p
CASE
WHEN rel.direction=false THEN
MERGE (n)-[:test]->(p)
ELSE
MERGE (n)<-[:test]-(p)
END
RETURN id(n)
收率:
無效的輸入 'S':預期 'L/L'(第5行,第11欄(偏移:108)) 「CASE」 ^
CREATE (n%-(:%s%) {properties})
WITH n
UNWIND {rels} AS rel MATCH (p) WHERE ID(p)=rel.nodeid
WITH n,p
MERGE
(CASE
WHEN rel.direction=true THEN (p)<-[:test]-(n)
ELSE (p)-[:test1]->(n)
END)
收率:
輸入無效 'W':預期的空白,評論,節點標籤,MapLiteral,一個參數, ')' 或一個關係模式(第5列第33列(偏移:174)) 「MERGE(CASE WHEN
我該怎麼做到這一點?
編輯:
我有什麼至今:僅
CREATE (n {properties})
WITH n,
filter(x IN {rels} WHERE x.direction = true) AS outs,
filter(x IN {rels} WHERE x.direction = false) AS ins
UNWIND outs as out
OPTIONAL MATCH (o) WHERE ID(o)=out.id
FOREACH (y IN CASE WHEN o IS NULL THEN [] ELSE [1] END |
MERGE (n)-[:test]->(o))
WITH n, ins
UNWIND ins as in
OPTIONAL MATCH (i) WHERE ID(i)=in.id
FOREACH (y IN CASE WHEN i IS NULL THEN [] ELSE [1] END |
MERGE (n)<-[:test]-(i))
RETURN id(n)
的RETURN id(n)
作品時ins
和outs
是不是空的。並且如果ins
或outs
中存在多個元素,它將返回id(n)
length(ins)*length(outs)
次,這並不是真正需要的。
所以:如何在所有情況下返回id(n)
並且只有一次?
EDIT2:
我現在用的是在UNWIND
CASE
所以它是保證返回即使{rels}
是空創建的節點ID。 另外LIMIT 1
在return語句中保證只返回一行。
CREATE (n {properties})
WITH n,
filter(x IN {rels} WHERE x.direction = true) AS outs,
filter(x IN {rels} WHERE x.direction = false) AS ins
UNWIND (CASE WHEN length(outs) > 0 THEN outs ELSE [{id:-1}] END) as out
OPTIONAL MATCH (o) WHERE ID(o)=out.id
FOREACH (y IN CASE WHEN o IS NULL THEN [] ELSE [1] END |
MERGE (n)-[r:child]->(o))
WITH n, ins
UNWIND (CASE WHEN length(ins) > 0 THEN ins ELSE [{id:-1}] END) as in
OPTIONAL MATCH (i) WHERE ID(i)=in.id
FOREACH (y IN CASE WHEN i IS NULL THEN [] ELSE [1] END |
MERGE (n)<-[r:child]-(i))
RETURN id(n) LIMIT 1
很確定這不是完美的,但它正在完成這項工作。
聽起來像是你在返回之前需要'WITH DISTINCT n'。 – InverseFalcon
我現在使用'RETURN id(n)LIMIT 1'來代替,因爲我認爲它使用更少的資源!? – Otti