2016-12-15 39 views
0

合併關係方向取決於我有像映射列表參數

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)作品時insouts是不是空的。並且如果insouts中存在多個元素,它將返回id(n)length(ins)*length(outs)次,這並不是真正需要的。

所以:如何在所有情況下返回id(n)並且只有一次?

 

EDIT2:

我現在用的是在UNWINDCASE所以它是保證返回即使{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 

很確定這不是完美的,但它正在完成這項工作。

+0

聽起來像是你在返回之前需要'WITH DISTINCT n'。 – InverseFalcon

+0

我現在使用'RETURN id(n)LIMIT 1'來代替,因爲我認爲它使用更少的資源!? – Otti

回答

0

您可以從您最初的rels集上創建兩個不同的集合身心他們,一個簡單的例子:

WITH [{id:14, direction:false},{id:15, direction:true}] AS rels 
CREATE (n:Node) 
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 
MERGE (o:Node {id: out.id}) 
MERGE (o)-[:OUT]->(n) 
WITH n, ins UNWIND ins AS in 
MERGE (i:Node {id: in.id}) 
MERGE (i)<-[:IN]-(n) 

測試在這裏:

http://console.neo4j.org/?id=iv5opz

enter image description here

+0

非常棒!任何我可以成功使用'return ID(n)'的方法,即使rels中的id不存在?目前,只要'outs'或'ins'只有不存在的節點就會失敗。 (我使用'MATCH(o)WHERE ID(o)= out.id',因爲我不想在它不存在的情況下創建它)。 – Otti

+0

問題在於'UNWIND'會導致'return ID(n)'語句被稱爲'length(o)* length(i)'次。如果'o'和'i'是0,那麼沒有任何東西會被返回! – Otti