2013-08-08 2 views
1

cypher 및 neo4j 2.0 사용.노드 간 관계를 병렬로 생성

두 개의 노드 ID (동일한 길이)와 가중치 세트가 주어지면 해당 노드 간의 관계를 만들고 그 가중치를 특성으로 설정하려고합니다. 예를 들어 나는 세 가지 목록 다음과 같은 경우 : 나는 다음과 같은 표현을

101 - knows {w : .1} - 102 
201 - knows {w : .6} - 202 
301 - knows {w : .25} - 302 

을 만들려면하지만 것

node list 1: (101, 201, 301) 
node list 2: (102, 202, 302) 
weights:  (0.1, 0.6, 0.25) 

을하지, 예를 들어, 101 - knows - 302

나는 이상 반복하여이 작업을 수행 할 수 있습니다

내 매개 변수를 만들고 개별 쿼리를 만듭니다. 배치를 실행하여 매개 변수로 내 위치를 전달하고 cypher에 순서대로 노드 & 속성을 일치하도록 요청합니까?


나는 일하는 것이 다음과 같은 방식으로 매개 변수를 사용하여 잠시 생각하지만, 대신 관계의 모든 순열을 생성 (예상대로) 및 각 속성으로 가중치의 전체 목록으로 지정 관계.

{ 
    "query": 
     "START a1=node({starts}), a2=node({ends}) 
     CREATE UNIQUE a1-[r:knows {w : {weights}}]-a2 
     RETURN type(r), r.w, a1.name, a2.name", 

    "params": { 
     "starts" : [101, 201, 301], 
     "ends" : [102, 202, 302], 
     "weights" : [0.1, 0.6, 0.25] 
    } 
} 

답변

1

목록은 실제 생활에서 얼마나 큽니까? 한 번에 한 번에 세 번씩 보낼 것입니다.

그렇지 않으면 당신이 컬렉션을 사용하고 당신이 원하는 것을 할 foreach는 할 수 있어야한다 :

START a1=node({starts}), a2=node({ends}) 
FOREACH(w in filter(w in weights : head(w)=id(a1) AND head(tail(w))=id(a2)) : 
    CREATE UNIQUE a1-[r:knows {w : last(w)}]-a2 
) 

"params": { 
     "starts" : [101, 201, 301], 
     "ends" : [102, 202, 302], 
     "weights" : [[101,102,0.1], [201,202,0.6], [301,302,0.25]] 
} 
+0

마이클의 답장을 보내 주셔서 감사합니다. 내 목록은 50K만큼 큰 1K만큼 작을 수 있습니다. 올바르게 이해한다면 하나의 쿼리에서 반복하는 것이 아니라 내 쿼리를 반복하는 것이 가장 효율적입니까? –

+0

예, 특히 쿼리 캐시를 사용하는 매개 변수를 사용하면 일괄 처리 (예 : 일괄 처리 -rest-api, 2.0의 새 트랜잭션 끝점 또는 하나의 TX에 포함 된 java 포함)를 통해 많은 쿼리를 한 번에 보낼 수 있습니다. –

+0

또한 접근 방식을 통해 목록의 교차 제품을 만든 다음 다시 필터링해야합니다. –

관련 문제