2017-04-10 1 views
3

SDN 4.2.1을 사용하여 Neo4J에서 노드와 관계를 저장하고로드합니다.findBy에서 방향 지정 스프링 데이터 Neo4J의 깊이> 0 인 쿼리

지금까지 깊이 매개 변수가 2 인 findByXXX 메서드를 사용했습니다. 이제는 깊이를 3으로 늘려야하지만 쿼리가 느려지고 그 이유를 알 수 있습니다. 실행 된 쿼리는 관계의 방향. 여기

는 로그에서 실행 된 쿼리입니다 (20 초 이상 소요) :

o.n.o.drivers.bolt.request.BoltRequest : Request: MATCH (n:`Property`) WHERE n.`id` = { `id_0` } WITH n MATCH p=(n)-[*0..3]-(m) RETURN p, ID(n) with params {id_0=P31} 

을 나는 방향와 쿼리 를 다시 작성하면 매우 빠른됩니다 :

MATCH (n:`Property`) WHERE n.`id` = "P31" WITH n MATCH p=(n)-[*0..3]->(m) RETURN p, ID(n) 

내 경우 GraphRepository 인터페이스의 findByXXX 함수 선언에서 "나가는"관계 만 원한다는 것을 명시 할 방법을 찾을 수 없습니다. 방향을 알려주는 "@Depth"주석과 같은 매개 변수가 있습니까?

답변

2

현재 주석을 통해보다 세분화 된 쿼리를 선언 할 방법이 없습니다. 사실 코드에 대한 몇 가지 힌트가 특정 경로를 따르는 것이 아니라 특정 경로를 따르는 것이 좋지만 다른 경로와는 관련이 없습니다.

예를 들어 JPA에서 수행 된 작업을 살펴보면 주석을 사용하여 종속 된 객체를 열심히로드 할 수 있습니다. 그러나 응용 프로그램이 커지면 FetchProfiles 또는 NamedEntityGraphs을 사용하여 유스 케이스에 따라 가져 오는 방법을 처리해야합니다.

SDN 4.x에서이 작업을 수행하는 가장 좋은 방법은 사용자 정의 사이퍼 쿼리를 사용하는 것입니다. 그것은 당신이 performant 방법으로 필요한 데이터를 데리러 수 있도록합니다.

이 트랙을 추적하는 데 문제가 있습니다. here OGM/SDN의 다음 주요 릴리스에 대해 계획된 개선 사항 중 하나임에 유의하십시오. 특정 유스 케이스가 있다면이 문제를 해결해야합니다. 느슨한 채널 neo4j-users에서 자유롭게 토론하십시오.

+0

감사합니다. 사용자 지정 쿼리를 사용합니다. – Pierre

+0

가변 깊이 매개 변수를 사용하여 쿼리를 작성하는 방법이 있습니까? 나는 그것을하려고 노력했다 : ''@Query ("MATCH (n :'Item') WHERE n.'id' = {id} WITH n MATCH p = (n) - [* 0 .. {depth (Item), node (p), rels (p) ") ItemResult findByid (@Param ("id ") 문자열 ID, @Param ("깊이 ") int 깊이);" SyntaxError : '매개 변수 맵을 MATCH 패턴에서 사용할 수 없습니다 (리터럴 맵을 대신 사용하십시오). '{깊이} '를 (를)'3 '으로 바꿔도 괜찮습니다 ... – Pierre