2017-05-05 1 views
0

나는 neo4j 및 스프링 데이터를 사용하여 백만 개의 개체에 페이지 매김을 시도합니다. 내 프로그램은 두 개의 쿼리를 실행합니다 : 첫 번째 일치하는 데이터. 두 번째는 내 제한 사항과 일치하는 모든 요소를 ​​계산합니다. 그러나 마지막 쿼리는 많은 시간이 걸립니다.쿼리가 너무 오래 걸리며

@Autowired 
Neo4jOperations template;` 


StringBuilder query = new StringBuilder(" match (n:Domain) where n.isPrincipale={isPrincipale} "); 
mapOfVars.put("isPrincipale", true); 
    if (request.getParameterMap().containsKey("mydom") 
     && !request.getParameter("mydom").isEmpty()) { 
      query.append(" and n.domain =~ {mydom}"); 
      mapOfVars.put("mydom",".*(?i)"+request.getParameter("mydom")+".*"); 
} 

probleme은 여기 :

iTotalRecords = Integer.valueOf((template.query(query.toString() + " return count(n) as count", mapOfVars)).queryResults().iterator().next().get("count").toString()); 

난 매칭 결과를 얻을 계산 후 :

query.append(" 
    return n.domain as domain, n.hasDmarc as dmarc , 
    n.spf_action as spf, n.updatedAt as updatedAt , 
    n.existValue as exst , id(n) as id 
    skip {start} limit {displayCount}"); 
mapOfVars.put("start", iDisplayStart); 
mapOfVars.put("displayCount", iDisplayCount); 

Iterable<Map<String, Object>> domains = template.query(query.toString(), mapOfVars); 
+1

자세한 내용을 공유하십시오. 그렇지 않으면 도움을받을 수 없습니다. 빠른 계산을위한 방법이 있지만 세부 정보를 제공하지 않고 ... –

+0

편집 된 게시물을 확인하십시오. –

답변

2

경우를


는 PAGINATE 기능의 일부이고 너는 색인 (또는 유일성 co nstraint)를 :Domain(isPrincipale)에 입력하면 neo4j가 일치하는 노드를 찾기 위해 모든 노드를 스캔해야합니다. 인덱스를 사용하여 같은 표지 노드의 상대적으로 작은 비율이 isPrincipale 값이있는 경우 가장 당신이 원하는 데 도움이,하지만

CREATE INDEX ON :Domain(isPrincipale); 

참고 :

실행이 쿼리를 인덱스를 만들려면 시합. 불행히도 isPrincipale 값은 부울 값이므로 (가능한 값은 2 개뿐입니다) 색인 생성이 도움이되지 않을 수 있습니다.

[업데이트]

가장 큰 문제는 (그들을 계산하는 경우 모두, 각 매김 단계에서) 일치하는 모든 Domain 노드 때마다를 얻기 위해 전체 쿼리를 수행하는 것입니다. 이것은 분명히 매우 비쌉니다. 모든 일치하는 노드를 얻은 다음 로컬에서 계산 및 페이지 매기기를 수행하는 것이 속도면에서 더 낫습니다.

속도를 높이는 또 다른 방법은 비싼 regexp 문자열 비교를 제거하여 일치하는 Domain 노드를 찾는 것입니다. 가능한 mydom 문자열 집합을 미리 아는 경우 해당 문자열과 해당 Domain 노드 사이의 관계를 DB에 저장할 수 있습니다. 예를 들어 DomainName 노드를 만들고 각각 노드와 적절한 노드 Domain 사이에 HAS_DOMAIN 관계를 만들 수 있습니다. 이렇게하면 첫 번째 코드 스 니펫이 더 빠르게 쿼리 될 수 있습니다.

@Autowired 
Neo4jOperations template;` 

StringBuilder query = new StringBuilder(); 
String mydom = request.getParameter("mydom"); 
if (mydom != null && !mydom.isEmpty()) { 
    query.append("MATCH (:DomainName {name: $mydom})-[:HAS_DOMAIN]->(n:Domain) "); 
    mapOfVars.put("mydom", mydom); 
} else { 
    query.append("MATCH (n:Domain) "); 
} 
query.append("WHERE n.isPrincipale=$isPrincipale") 
mapOfVars.put("isPrincipale", true); 
+0

이미 생성되었습니다. 또한 내 쿼리에는 모든 도메인 속성에 대한 제한이 포함될 수 있습니다. 그래서 모든 속성에 대한 색인을 생성하고 싶지 않습니다. –

+0

이 상황에서 cahe에 대해 무엇을합니까? 주요 문제는 neo4j가 계산하는 동안 모든 도메인을 확인한다는 것입니다. –

+0

업데이트 된 답변보기 – cybersam

관련 문제