2017-04-25 3 views
0

MERGEFOREACH 절을 활용하여 Cypher에서 두 노드 간의 명확한 관계를 생성/업데이트하려고합니다. Cypher를 사용하여 Neo4J의 관계를 일괄 병합

는 지금, 나는 다음과 함께 할 노력하고 있어요,하지만 문법적으로 정확하지 :

MERGE (u1:Person {id:1}) 
MERGE (u2:Person {id:3}) 
FOREACH (score IN [{name:'R1',val:1.0},{name:'R2',val:0.5}]| 
    MERGE (u1)-[r]-(u2) 
    WHERE type(r) = score.name 
    ON CREATE SET r.weight=score.val,r.created=timestamp(),r.updated=r.created 
    ON MATCH SET r.weight=score.val,r.updated=timestamp() 
) 

당신은 그것을 달성하기 위해 나에게 질의를 제안 해주십시오 수 있습니다.

MERGE (u1)-[r]-(u2) 
WHERE type(r) = score.name 

이 허용되지 않는 유형없이 관계를 Creting,도 아니다 관계의 유형에 대한 변수 이름 (score.name)를 사용하는 것입니다 :

답변

0

나는 쿼리의 문제가이라고 생각합니다.

1) 일부 코드에서 쿼리를 작성하는 경우 여기에서 이름을 삽입하십시오. : PHP의 인스턴스의 경우 :

.... 
$rels[] = [val => 1.0, name => 'R1']; 
foreach ($rels as $rel) { 
    $query[] = 'MERGE (u1)-[r:' . '$rel["name"]' . ']-(u2)'; 
    ON CREATE SET r.weight=score.val, r.created=timestamp(), r.updated=r.created 
    ON MATCH SET r.weight=score.val,r.updated=timestamp() 
} 
.... 

이 때문에 아마의 관계에 대해 "R"식별자를 재사용의 오류를 줄 것이다,하지만 너무 그것을 변수하게 피할 수 있습니다.

2) 사용자 환경에서 사용할 수없는 클리너 솔루션은 APOC를 사용하는 것입니다. Neo4j 3.0 이상에서는 많은 기능을 사용할 수 있습니다. 특히 apoc.create.relationship.에 익숙하지 않습니다. here it´s quite well explained.

어쨌든 여기서 유용 할 경우를 대비하여 current open issue at neo4j repository도 남겨 둡니다.

관련 문제