저는 Neo4j를 처음 접했고 기본에 대해 이해할 수없는 것이 있어야합니다.Neo4j, Cypher 명령으로 대량로드
Java에서 많은 객체를 가지고 있으며이를 사용하여 Java 드라이버와 Cypher를 사용하여 Neo4j 그래프를 채 웁니다. 내 코드는 다음과 같이 작동합니다
// nodes
for (Person person: persons)
session.run (String.format (
"CREATE (:Person { id: '%s', name: \"%s\", surname: \"%s\" })",
person.getId(), person.getName(), person.getSurname()
));
// relations
session.run ("CREATE INDEX ON :Person(id)");
for (Friendship friendship: friendships)
session.run (String.format (
"MATCH (from:Person { id: '%s' }), (to:Person { id: '%s' })\n" +
"CREATE (from)-:KNOWS->(to)\n",
friendship.getFrom().getId(),
friendship.getTo().getId()
));
(나는 다스 노드 유형을 가지고 관계 유형의 같은 수에 대한 원인, 실제로는 약간 더 복잡).
이제는 300k 노드와 1M 관계를로드하는 데 1 시간 이상 걸리는 것과 같이 매우 느립니다 (Neo4j가 12/16GB RAM을 사용하는 상당히 빠른 MacBookPro에서).
내가 잘못하고 있습니까? 대신 batch inserter을 사용해야합니까? (네트워크를 통해 graphDB에 액세스 할 수 있어야합니다.) 하나의 트랜잭션에 더 많은 삽입을 그룹화하여 무언가를 얻을 수 있습니까? (문서에서 볼 때, 트랜잭션은 롤백 및 격리 요구에만 유용합니다.
감사합니다.하지만 내 경우에는 효과가 없을 것이라고 생각합니다. Neo4j가 동일한 작업을 수행하는 동안 내 응용 프로그램이 내부 그래프 (해시 맵 사용)를 3 분 이내에 채우는 것을 고려할 때 24-15ms는 많이 다릅니다. 그건 옳지 않을 수도 있고, 다소 차이가있을 것입니다. WIND의 경우 매개 변수로 목록을 보내는 것이 결국 많은 노드와 가장자리가있는 것을 고려하면 결국 너무 큰 쿼리가 될 것이라고 생각합니다. – zakmck
내 벤치 마크 결과가 나쁠 수도 있지만 최소한 UNWIND를 시도해 보길 강력히 권합니다. 페이로드 목록이 모든 데이터 * 일 필요는 없지만 위의 예제 코드에서와 같이 실제로는 그렇게합니다. 페이로드 크기가 ~ 100k이고 N 트랜잭션으로 가장자리를 채울 수 있다면 N * 100k 개별 트랜잭션에 비해 시간이 많이 절약됩니다. – sjc
감사합니다 @sjc, 나는 UNWIND에 요점을보고, 나는 그것을 시도합니다. – zakmck