2014-10-02 2 views
0

enter image description here 나는 웹 사이트에서 검색 필터 기능을 구현하고 있습니다. 나는 neo4j 인 데이터베이스에서 검색 결과를 가져옵니다. 필터를 적용하는 데 문제가 있습니다. 문제는 Bangalore에 대한 검색 결과를 10 개 추가 한 다음 다른 키워드를 추가하면 개발자가 전체 데이터베이스에서 결과를 얻을 수있게하지만 내가 원하는 것은 이전 방갈로르사이퍼 쿼리로 neo4j 데이터베이스에서 키워드 검색

입니다 선택 결과 또는 키워드

내 쿼리는 다음과 같습니다

 $data = array (
      "query" => "MATCH (x :Job)-[r :POSTED_JOB]-(m) where (x.city IN {data1} or x.categories or x.sectors IN {data4} or x.role IN {data5} or x.requirement IN {data6} 
      or x.title IN {data7} or x.description IN {data8}) 
      RETURN m.companyName,x.city", 
     "params" => array(
       "data1" => $city, 
       "data4" => $sector, 
       "data5" => $skills, 
       "data6" => $search, 
       "data7" => $search, 
       "data8" => $search 

) );

어떻게 결과를 구체화 할 수 있습니까?

답변

1

검색어가 OR으로 가득 차 있습니다. 즉, Job은 (해당 배열에 두 개의 data5 속성이 포함 된 경우) 일치합니다. 와 일치 시키려면 제공된 기준의을 입력 한 다음 ORAND s로 바꿉니다. 제공하는 데이터에 따라 NULL 값과 빈 목록을 조심해야합니다.

편집 - 예제 코드

이 내가 아마 당신이 얘기 필드를 일치 생각 쿼리의 작은 부분이다.

WHERE x.city IN {data1} OR x.role IN {data5} 

그것은 나에게 어떤 노드와 일치 말한다 (x)를 WHERE X X 개발자의 역할입니다 방갈로르 또는입니다. 당신이 방갈로르와 개발자 모두 만 기록과 일치하는 검색어를 원하는 경우 쿼리의 해당 섹션은 다음과 같아야합니다

WHERE x.city IN {data1} AND x.role IN {data5} 

x.categories 조금 너무 좌초 것 (당신은 아무것도하지만, 쿼리하지 않는 그 존재).

편집 - 포스트 채팅

요구 사항은 각 쿼리는 이전 결과에 필터 역할을 어디 연속 쿼리를 수행하는 것입니다. 모든 필드는 각 통화와 다시 매칭됩니다. 이를 수행하려면 조회를 체인화하고 각 일련의 조회에 ID 세트를 전달하는 데 사용할 수있는 외부 노드 ID가 필요합니다. 사이퍼에서 감소 된 예 :

초기 쿼리 :

MATCH (j:Job)<-[:POSTED_JOB]-(m) 
WHERE j.title=~{searchString} OR j.description=~{searchString} 
RETURN j.jobId, j.title, j.description, j.city, m.companyName 

후속 쿼리 :

MATCH (j:Job)<-[:POSTED_JOB]-(m) 
WHERE j.jobId IN {collectionOfJobIds} 
AND (j.title=~{searchString} OR j.description=~{searchString}) 
RETURN j.jobId, j.title, j.description, j.city, m.companyName 

편집 - 당신은 당신의 데이터를 재대 결을 할 수 있습니다 나에게

도청이되기 때문에 각 검색어에 대해 필터를 사용할 수 있습니다.

MATCH (j:Job)<-[:POSTED_JOB]-(m) 
WHERE j.title=~({searchStrings}[0]) OR j.description=~({searchStrings}[0]) 
WITH m, COLLECT(j) as jobs 
WITH m, FILTER (j IN jobs WHERE j.title=~({searchStrings}[1]) OR j.description=~({searchStrings}[1]) as filteredJobs 
RETURN m, jobs 

이렇게하려면 searchString을 배열로 전달해야하며 원하는만큼 WITH를 추가 할 수 있습니다 (배열 인덱스를 늘리십시오).이 모든 쿼리를 사용하면 매우 많은 작업이있는 경우 시스템에서 모든 작업을 일치시켜 시작할 때 속도가 느려질 것이라는 것을 인식하는 것이 중요합니다. 초기 경기에 제한을두면 인생이 나아질 것입니다!

ASIDE : 당신의 모델은 City, Sector, Skills 등을 속성이 아닌 노드로 모델링 할 수있는 위치에 실제로 그래프가 아닙니다.

+0

감사합니다. @ JohnMark13 나는 당신이 말하려고하는 것을 얻지 못하고 있습니다. 예를 들어 자세히 설명해 주시겠습니까? –

+0

@Stefan Armbruster 제발 도와주세요 –

+0

당신이 이해하지 못하는 것이 무엇인지 설명해 주시겠습니까? – JohnMark13