2016-07-06 3 views
0

에서 인덱스에 추가되지어떤 노드가 Neo4j

load csv with headers from "file:/sample.csv" as Jobs 
create (TheJobs {Job_name: Jobs.insert_job, Job_type: Jobs.job_type, Owner: Jobs.#owner}) 
return TheJobs 

CREATE INDEX ON :TheJobs(Job_name) 

Output: Added 1 index, statement executed in 32 ms. 

가 그럼 난 관계를 만들려고 지수이었다 내가 작성하는 데 사용 된 명령을 다음과 같이 내가 노드를 만드는 데 사용되는 쿼리입니다 다음 쿼리를 사용하여

Profile load csv with headers from "file:/Jobstofiles.csv" 
as rels2 
match (from :Files {Filename: rels2.Filename}) 
where rels2.Automatic or Manual="Automatic" 
match (to :TheJobs {Job_name: rels2.Job}) 
create (from)-[:Is_triggered_by {type: rels2.Is_triggered_by}]->(to) 
return from, to 

실행 계획은 nodeindexseek를 표시하지만 데이터가 0 인 행/일치를 반환합니다. 나는 다음과 같은 쿼리 내가 잘못 뭐하는 거지

PROFILE MATCH (node :Jobindex {Job_name: 'Job1'}) RETURN node 

Output: 0 rows 

를 사용하여 인덱스에서 노드를 검색 할 때 명확하게

일치?

+0

당신의 말씨와 질문을 볼 때, 나는 당신이 색인이 무엇인지, 그리고/또는 어떻게 색인이 neo4j에서 작동하는지 이해하지 못한다고 생각합니다. 여러분이 만든 노드에 대한 세부 사항과이 명령이 무엇을하고 있다고 생각하는지 이해할 수 있습니까? 그것은 내 가정을 확인하거나 배제 할 수 있으며 실제 문제를보다 효과적으로 해결할 수있게 해줍니다. – InverseFalcon

+0

인덱스를 이해하면 특정 속성 (주로 기본 키)에 따라 인덱스가 만들어집니다. 이것은 해당 속성을 가진 모든 노드의 해당 속성에 대한 모든 값의 중복 목록과 같습니다. 따라서 인덱스 된 속성의 특정 값을 기반으로 노드를 검색하면 neo4j는 모든 노드를 검색 할 필요가 없으며 대신 인덱스의 속성 값과 관련된 노드 만 찾습니다. – MohanVS

+0

로드 csv 작업을 사용하여 관계를 만들려고하고 있는데 여기서 인덱스를 사용하여 노드를 찾으려고합니다. 905 개의 관계 집합에 대해로드 연산을 실행했습니다. 인덱싱되지 않은 실행 시간은 7 분입니다. 이를 달성하기위한 db 적중 횟수는 모든 노드를 검색 할 때 6 억 2 천만입니다. 색인을 사용하여이를 줄이려고합니다. – MohanVS

답변

1

neo4j에서 인덱스를 사용하는 방법을 잘못 읽은 것 같습니다. 인덱스의

당신의 창조 : 그것이 작동하는 방법

CREATE INDEX ON :Jobindex(Job_name) 

모든 노드의 작업 이름 속성에 Jobindex라는 인덱스를 생성하지 않는, 그건 아니에요.

대신에 : Jobindex 레이블을 사용하여 노드의 Job_name 속성에 대한 인덱스를 만들었습니다. Jobindex 노드에 Job_name 속성이있는 경우에만이 인덱스가 사용된다는 것을 의미합니다.

다른 종류의 노드에서 Job_name 등록 정보에 대한 색인을 작성해야하는 경우 해당 노드의 레이블이있는 색인을 작성하십시오. 레이블이 다른 노드에서 해당 속성에 대해 색인을 생성하려면 해당 노드에 적용 할 수있는 보편적 레이블이 더있는 지 고려한 다음 해당 노드에 대해 색인을 생성하십시오 (노드에 여러 레이블이 있음을 기억하십시오).

색인을 사용하는 경우 색인을 강제로 사용하는 방법이 있지만 일반적인 경우는 아닙니다. 인덱스 사용은 거의 보이지 않으며 특수한 구문이 없으며 인덱싱되는 속성을 사용하여 일치 항목을 작성하면 해당 항목이있는 경우 인덱스가 사용되어 조회 속도를 높입니다. 즉

, 당신이에 색인 경우 : 작업 (작업 이름), 당신은 이름으로 작업을보고 싶어, 당신이 그것을 쿼리 것 :

MATCH (job:Job{Job_name:"Software Engineer"}) 
... 

당신이 쿼리 얼마나 정확히 어떤 색인없이.

저는 Cypher 설명서 rereading the Schema section을 제안합니다.

편집 : 예제 추가.

그래서 가져 오는 데이터에서 : 작업 레이블을 가진 노드를 만들려고합니다. 이름이 빠른 조회를위한 Job_name 속성을 갖습니다.

당신은이 같은 색인 생성 할 수 있습니다 : 경우, 조회 속도를 개선하기 위해 그 인덱스를 활용합니다 작업 노드와 노드의 작업 이름 속성 :

CREATE INDEX ON :Job(Job_name) 

그런 식으로 명시 적으로 사용하는 모든 작업을 가능한.

그러나 대소 문자가 다른 경우 동일한 속성을 가진 여러 종류의 노드에 대해 인덱싱을 수행해야하는 경우에도 해당 인덱스에 대한 공통 레이블이 필요합니다. 이것이 데이터 가져 오기 일 뿐인 경우에는 약간의 속임수를 쓰고 여러 라벨이있는 노드를 만들 수 있습니다.이 라벨 중 하나는 색인을 생성 한 라벨입니다. 그런 다음 가져 오기가 끝나면 더 이상 사용하지 않는 색인을 삭제할 수 있습니다.

+0

안녕하세요, 실제로 주어진 속성을 가진 모든 노드를 색인하고자하므로 색인을 사용했습니다. 그러나 특정 작업 이름을 제공하는 인덱스를 사용하여 검색 할 때 0 일치를 반환합니다. 데이터 불일치가 있는지 확인했지만로드 된 데이터는 100 % 깨끗하고 일관성이 있습니다. – MohanVS

+0

알았어, 내 가정과 일치 해. 색인은 항상 레이블 + 특성 조합에서 작성되며 모든 노드의 특성에 대해서만 색인화 할 수는 없습니다. 그리고 위에서 언급했듯이 적어도 명시 적으로는 아니더라도 인덱스를 통해 노드를 찾는 것과 같은 것은 없습니다. 색인이 레이블 + 특성 조합에있는 경우 조회 및 조작은 두 x 째 항목의 색인을 이용합니다. – InverseFalcon

+0

좋아, 그래서 내가 노드를 만드는 데 사용 된 쿼리는 다음과 같습니다. "파일 : /sample.csv"에서으로 작업 으로 생성 된 헤더를 가진 CSV를로드합니다. (TheJobs {Job_name : Jobs.insert_job, Job_type : Jobs.job_type, Owner : Jobs'# owner', Std_out_file : Jobs.std_out_file}) return 인덱스를 생성하는 데 사용 된 작업과 명령은 다음과 같습니다. CREATE INDEX ON : TheJobs (Job_name) – MohanVS

관련 문제