2014-04-23 3 views
0

암호가 없으면 노드를 만들지 못하게하는 방법이 있습니까? 나는 소품 배열의지도가병합으로 인해 노드가 생성되지 않음

FOREACH(p in {props} | 
    MERGE (I:Interface {IfIPAddress:p.OrigIPAddress}) 
    MERGE (I2:Interface {IfIPAddress:p.TermIPAddress}) 
MERGE (I)-[r:link]->(I2) 
SET r = p) 

같은 쿼리가 있습니다.

첫 번째 및 두 번째 병합에서 I 및 I2가 생성되는 것을 원하지 않습니다. 그것은 가능한가?

+0

조금 설명해 주시겠습니까? 첫 번째와 두 번째 병합에서 I와 I2가 생성되는 것을 원하지 않는다고 말하면 루프의 처음 두 반복에서 생성되도록하지 않으려는 것입니까? 아니면 병합으로 노드를 만들지 말라고 말하고 있습니까? 병합의 전체 요점은 발견되지 않으면 노드를 만들거나 그렇지 않으면 노드를 생성한다는 것입니다. 일치/업데이트 작업 만 수행하려고합니까? 또는 당신의 유스 케이스는 여기에 있습니까? – BtySgtMajor

+0

foreach에서 일치 항목을 사용할 수 없기 때문에 사이퍼에 오류가 발생합니다. 제 질문은 foreach에서 Match에 대한 대안이 있습니까? 내가 읽은 것이 무엇이든 내가 병합을 사용할 수 있다는 것을 알았지 만 병합의 문제는 내가 원하지 않는 인터페이스 노드를 생성한다는 것이다. – Nipun

+0

인터페이스 속성을 업데이트하고 쿼리에서 관계를 만드는 것이 목표입니까? 아니면 관계를 만듭니 까? – BtySgtMajor

답변

1

지도를 반복하고 각지도 항목에 대한 검색어를 동적으로 생성하는 것이 궁금한가요? 나는. 단일 쿼리에서 여러 개를 수행하지 마십시오.

+0

흠. 마침내 나는 그것을해야만 창조의 시간을 증가시킬 것이다. 그것이 창조에서 많은 시간을 절약 할 것 인 것에 따라 만일 그것이 한 번에하게 될 수 있으면 gr8 일 것이다 – Nipun

0

foreach 루프에서 일치시킬 수 없습니다. 읽기 및 업데이트 작업을 별도로 완료해야한다는 기본적인 제한 때문일 수 있습니다 (docs 참조). MERGE을 껌과 덕트 테이프가 달린 MATCH처럼 작동시키는 방법이 있지만,이 제한을 받아들이고 각 작업에 대해 플랫 쿼리를 실행하는 것이 더 쉽습니다. 왜 이런 쿼리를 실행하지 않는 다른 이유가 있습니까?

MATCH (I:Interface {IfIPAddress:p.OrigIPAddress}), (I2:Interface {IfIPAddress:p.TermIPAddress}) 
MERGE (I)-[r:link]->(I2) 
ON CREATE SET r = p 

예를 들어 foreach 루프에 반복이 있으므로 트랜잭션 당 많은 문을 사용하여 트랜잭션 Cypher 끝점에서 실행하십시오.

+0

고마워. 내가이 쿼리를 피하는 이유는 한 번에 많은 링크가 만들어지기 때문입니다. 나는 소품 배열지도를 가지고 있으므로 링크를 만들 때마다 서버에 요청하는 대신 단일 쿼리를 사용하여 모든 링크를 만들고 싶습니다. 생성 할 링크 수는 10 K에서 20 k까지입니다. – Nipun

+0

시도 했습니까? 아니면 추측 중입니까? 한 요청에서 임의의 수의 명령문을 보낼 수 있으며 한 트랜잭션에서 임의의 수의 요청을 실행할 수 있습니다. 하나의 명령. 또는 20k 명령.에서 20k 관계를 작성 하든지간에 그래프 조작은 동일합니다. 유선에 일부 오버 헤드가 있지만 보상으로 쿼리 캐싱이 훨씬 더 좋을 것입니다. [트랜잭션 엔드 포인트] (http://docs.neo4j.org/chunked/milestone/rest-api-transactional.html) 및 [jdbc 드라이버] (http://www.neo4j.org/develop/tools/jdbc)를 참조하십시오. . – jjaderberg

관련 문제