2014-07-22 1 views
1

더 나아 가기 전에 다음은 내 데이터 모델의 representation입니다. 나는 Neo4J 1.9.2로 그 순간 붙어 있고, 오히려 큰 데이터베이스 (내가 말할 수있는 한 ~ 1 백만 노드, 모든 데이터가 수집 될 때 점점 줄어들지 만)가 있습니다. 이제 당신이 염두에두고, 내가 깎인 검색에 의해 무엇을 의미하는지 설명하게하십시오.다중 링크 cypher neo4j 최적화 (//면 처리 된 검색?)

내 항목 (documentaryUnit)은 언젠가 다른 유형을 가질 수있는 키워드에 연결됩니다. 내가 구현하고 싶은 것은 몇 가지 키워드를 선택하고 keyword1, keyword2 등에 연결되는 요구 사항과 일치하는 노드가 있는지 확인하는 것입니다. 패싯 검색은 주로 일명 '일명'이라고 할 수 있습니다. 가능성의 수를 보여 주며 다른 결과와 일치하는 결과가 0이면 쿼리 할 수 ​​없게합니다. 나는이 "간단한"쿼리를 할 수 있기를 원한다. 나는 Neo4J 세계에서 꽤 새로운 것을 알기 때문에 전에는 답을 찾지 못했지만 개념적으로 부족한 부분이 있기 때문에 올바른 게시물을 놓친 것일 수도 있습니다. 함께 또는 별개없이

START 
    facet1 = node:entities("__ID__:keyword-104"), 
    facet2 = node:entities("__ID__:place-1"), 
    facet3 = node:entities("__ID__:keyword-2"), 
    facet4 = node:entities("__ID__:keyword-258") 
MATCH 
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet1), 
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet2), 
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet3), 
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet4) 
WITH distinct elem, facet1, facet2, facet3, facet4, link 
RETURN elem 

는 나이를 취하고 기본적으로 때로는 충돌 :

그래서, 여기에 내가 시도 쿼리입니다. 두 개의 키워드만으로도 잘 작동합니다 (< 100ms). 3은 길고, 4 번 이상 충돌합니다. 외부 서비스를 사용하지 않고이를 수행 할 방법을 찾아야합니다 (solr은 업그레이드를위한 옵션이 아닙니다).

내가 첨부 한 그림이 있으면 원하는 것은 1,445,3 번 키워드에 첨부 된 # 1과 같은 documentaryUnit을 링크를 통해 찾는 것입니다. 나는 그렇게뿐만 아니라 컬렉션 시도 : 충돌하지만 시작 엔트리 포인트로 basenode이 많이 걸립니다하지 않습니다

START doc = node:entities("__ISA__:documentaryUnit") 
MATCH (doc)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(accessPoints) 
WITH collect(accessPoints.__ID__) AS accessPointsId, doc 
WHERE ALL (x IN ['keyword-104', 'place-1', 'keyword-2'] 
      WHERE x IN accessPointsId) 
RETURN doc.__ID__ 

. 1000ms에서 2000ms 사이를 유지합니다.

은 당신이 뭔가를

답변

0

두 솔루션을 게시 할 때 가능한 한 빨리 응답 할 것이다,이를 읽어 주셔서 감사합니다. (270 밀리 초 이후에 캐싱은 500ms, 주위에) 최고의 하나 다음 parenthis 제거 후

START 
    facet1 = node:entities("__ID__:kw-1"), 
    facet2 = node:entities("__ID__:kw-2"), 
    facet3 = node:entities("__ID__:kw-3"), 
    facet4 = node:entities("__ID__:kw-4") 
MATCH 
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet1, 
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet2, 
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet3, 
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet4 
WHERE elem.__ISA__ = "documentaryUnit" 
RETURN elem 

START 
    accessPoints = node:entities("__ID__:kw-1 OR __ID__:kw-2 OR __ID__:kw-3 OR __ID__:kw-4") 
MATCH 
    (doc)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->accessPoints 
WHERE doc.__ISA__ = "documentaryUnit" 
WITH collect(accessPoints.__ID__) AS accessPointsId, doc 
WHERE ALL (x IN ['kw-1', 'kw-2', 'kw-3', 'kw-4'] 
      WHERE x IN accessPointsId) 
RETURN doc 

두 번째의 5000ms 400 MS는 방법을 나에게 빠른 응답을했다.