2017-12-21 2 views
0

나는 neo4j를 (를) 처음 사용하고 있으며 현재 진행중인 작업에 대한 사이퍼 쿼리를 사용하고 있습니다. Java에서 neo4j 볼트 드라이버를 사용하고 있습니다. 여기 달성하고자하는 것이 있습니다. 나는 자바의 ArrayList로 사용할 수있는 데이터 다음과 같이 (는 HashMap에 저장)를 가지고 :neo4j 그래프에서 일대일 관계를 가장 효율적으로 만드는 방법은 무엇입니까?

employerId 2 : employeeId를 1, 직원 ID 2, employeeId3, ...] 기본적으로 사용자와 근로자 사이의 관계를 보여줍니다

(이들은 고용주 2의 직원 임)

이제이 직원을 그래프에서 찾을 수 있습니다 (이미 존재하거나 존재하지 않을 수도 있음) "(x : 고용주) - [고용] - > (y : 직원) " 그들 사이의 관계.

내가 생각할 수있는 편도 (아마 순진)는 매번 고용주와 직원을 검색하고 각각에 대해 별도의 CREATE 쿼리를 실행하는 것입니다.

match (employer:Employer{name:"John"}), (name:Employee{name:"Snow"}) CREATE (employer)-[pr:EMPLOYES]->(employee) 

하지만 동일한 고용주 노드를 여러 번 검색하는 것이 불필요하다고 생각합니다. 그리고 나에게는 지금 시간이 중요한 기준이기 때문에, 나는 더 좋은 방법을 찾고있다. (존재한다면)

neo4j에 초보자로서, 내가 생각할 수있는 것은 고용주 ID에 대한 검색을 한 번하고, 그 결과를 사용하여 여러 쿼리를 실행할 수 있으며 매번 Employee ID가 검색됩니다. 그러나이 작업을 수행 할 정확한 쿼리를 찾을 수 없습니다. 또한, 이것이 올바른 접근 방법이 될 것인가? Java에서이 쿼리를 준비해야합니다. 여러 번 쿼리하거나 단일 쿼리를 보내야합니까?

답변

1

이 쿼리는 @Lju의 쿼리와 비슷합니다. 그러나 몇 가지 개선 사항이 있습니다. EmployerMERGE

  1. 한 번만 수행해야합니다, 그래서 그것은 UNWIND 앞에 와야한다. 그렇지 않으면 모든 Employee에 대해 수행됩니다.
  2. parameters에 고용주 이름 (또는 ID)과 직원 목록 (예 : )을 전달해야합니다. 다음 예제에서 의 경우 Cypher 코드는 $employerName$names과 같은 매개 변수를 나타냅니다.
  3. 또한 2 MERGE 절 사이의 WITH 절이 모든 식별자를 전달하는 중이므로 필요하지 않습니다. 그러나 Cypher 구문에서는 MERGEUNWIND 사이에 WITH 절이 필요합니다.

검색어 :

MERGE (employer:Employer {name: $employerName}) 
WITH employer 
UNWIND $names AS name 
MERGE (employee:Employee {name: name}) 
MERGE (employer)-[:Employs]->(employee) 
RETURN * 
+0

가 완벽하게 작동하고, 작업을 수행합니다. 벤치마킹을 통해 성능에 도움이되는지 확인합니다. (해야하는 것처럼 보입니다) 대답을 승인 된 것으로 표시합니다. –

관련 문제