2015-02-04 6 views
2

저는 약간 큰 텍스트 파일 (약 100k 라인)을 읽고 구문 분석하고 해당 데이터와 함께 Neo4j 노드를 구축합니다 (나는 Neography를 사용하고 있습니다) Ruby on Rails 프로젝트 작업 중입니다. 이 내가 쓴 코드의 Neo4j 관련 부분입니다 : 내가 뭘 원하는큰 파일을 파싱하고 Neo4j 데이터베이스를 채 웁니다.

d= Neography::Rest.new.execute_query("MATCH (n:`Label`) WHERE (n.`name`='#{id}') RETURN n") 
    d= Neography::Node.load(d, @neo) 
    p= Neography::Rest.new.create_node("name" => "#{id}") 
    Neography::Rest.new.add_label(p, "LabelSample") 
    d=Neography::Rest.new.get_node(d) 
    Neography::Rest.new.create_relationship("belongs_to", p, d) 

그래서입니다 : 구문 분석 된 데이터와 동일한 "이름"필드 노드에 대한 이미 채워 DB에서 검색 이 데이터에 대한 새 노드를 만들고 마지막으로 두 노드 간의 관계를 만듭니다. 분명히이 코드는 실행에 너무 많은 시간이 걸립니다. 그래서 Neography의 일괄 처리를 시도했지만 몇 가지 문제가 발생했습니다.

p = Neography::Rest.new.batch [:create_node, {"name" => "#{id}"}] 

가 나에게 "`분할 정의되지 않은 메서드했다. '전무을 위해 : NilClass을".

ID [ "자기"]에서 분할 ('/ ') 마지막

d=Neography::Rest.new.batch [:get_node, d] 

나를 준다 get_node에 대한 Neography :: UnknownBatchOptionException

나는 이것이 충분한 시간을 절약 할 지 확신하지 못한다.

예를 들어, Batch Import을 사용하여 여러 가지 방법을 시도했지만 이미 db에서 필요한 노드를 만들 수있는 방법을 찾을 수 없습니다. 알다시피, 나는 이것에 대해 좀 익숙해 져서 어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

답변

1

순수 cypher (또는 neography generated cypher)로이 작업을 수행 할 수 있습니다. 이 아마도 같은 뭔가 : 나는 PARAMS을 사용하고

MATCH (n:Label) WHERE n.name={id} 
WITH n 
MERGE (p:LabelSample {name: n.name}) 
CREATE p-[:belongs_to]->n 

참고 : 나는 CREATE 사용하고 있습니다,하지만 당신은 당신이 할 수있는 중복 LabelSample 노드를 작성하지 않으려면하지

MATCH (n:Label) WHERE n.name={id} 
WITH n 
CREATE (p:LabelSample {name: n.name})-[:belongs_to]->n 

(일반적으로 하나의 쿼리 일 뿐이지 만 큰 문제는 아닙니다.)

+0

감사합니다. Brian, 시도해 봤지만 성능은 눈에 띄게 좋았지 만 여전히 약 25 분이 걸립니다. 내 8을 처리하기 위해 "내 80 분이 지났어. 나는 내 코드에서 포기했다."). 0k 행의 긴 샘플 데이터 세트. 더 이상 성능을 향상시킬 수있는 방법이 있습니까? – AGarofoli

+0

@AGarofoli 동일한 쿼리를 반복해서 수행하는 경우 params에서 큰 성능 향상을 얻을 수 있습니다. http://neo4j.com/docs/stable/cypher-parameters.html을 확인하고 '{ 이름 : n.name}'을 (를) 매개 변수와 함께 사용하십시오. 또한 모든 X 항목을 닫는 트랜잭션에서 업데이트 청크를 수행 할 수도 있습니다. 네가 네오 그래피로 어떻게할지는 모르겠지만, 조금 더 힘을 줄거야. – subvertallchris

관련 문제