2016-07-27 2 views
1

나는 다음과 같은 기관이 :이 쿼리에Neo4j 사이퍼 쿼리 내 봄 데이터 Neo4j 프로젝트에서

@Query("MATCH (d:Decision)<-[:DEFINED_BY]-(c:Criterion) WHERE id(d) = {decisionId} and c.name = {name} RETURN c") 
Criterion findCriterionDefinedByDecisionByName(@Param("decisionId") Long decisionId, @Param("name") String name); 

기반 : 나는 다음과 같은 SDN 저장소 방법을 한

@NodeEntity 
public class Decision extends Commentable { 

    private final static String CONTAINS = "CONTAINS"; 
    private final static String DEFINED_BY = "DEFINED_BY"; 

    private String name; 

    @Relationship(type = DEFINED_BY, direction = Relationship.INCOMING) 
    private Set<CriterionGroup> criterionGroups = new HashSet<>(); 

    @Relationship(type = DEFINED_BY, direction = Relationship.INCOMING) 
    private Set<Criterion> criteria = new HashSet<>(); 

... 

} 

@NodeEntity 
public class Criterion extends Authorable { 

    private final static String CONTAINS = "CONTAINS"; 
    private final static String DEFINED_BY = "DEFINED_BY"; 

    private String name; 

    @Relationship(type = CONTAINS, direction = Relationship.INCOMING) 
    private CriterionGroup group; 

    @Relationship(type = DEFINED_BY, direction = Relationship.OUTGOING) 
    private Decision owner; 

... 

} 

@NodeEntity 
public class CriterionGroup extends Authorable { 

    private final static String DEFINED_BY = "DEFINED_BY"; 
    private final static String CONTAINS = "CONTAINS"; 

    private String name; 

    @Relationship(type = DEFINED_BY, direction = Relationship.OUTGOING) 
    private Decision owner; 

    @Relationship(type = CONTAINS, direction = Relationship.OUTGOING) 
    private Set<Criterion> criteria = new HashSet<>(); 

... 

} 

Decision에 속한 특정 이름의 Criterion을 얻을 수 있습니다.

내 도메인 모델의 기준은 CriterionGroup에 속할 수도 있고 아닐 수도 있습니다.

이 조건과 일치하는 CriterionGroup을 확인하기위한 조건을 하나 더 추가하려면이 쿼리를 확장해야합니다. 다른 말로하면 제공된 {criterionGroupId}에 속한 특정 {decisionId} (즉 null 값의 경우가 아님)에 대한 구체적인 {name}이있는 Criterion을 반환해야합니다. {criterionGroupId} == null의 경우 어떤 CriterionGroup에도 속하지 않는 기준을 찾아야합니다.

@Query("MATCH (d:Decision)<-[:DEFINED_BY]-(c:Criterion)...????????...... WHERE id(d) = {decisionId} and c.name = {name} RETURN c") 
Criterion findCriterionDefinedByDecisionByName(@Param("decisionId") Long decisionId, @Param("name") String name, @Param("criterionGroupId") Long criterionGroupId); 

날이 쿼리를 작성 도와주세요 :

나는 이런 식으로 뭔가를해야합니다.

답변

1

이 작업을해야합니다, 당신은 CriterionCriterionGroups 수만 있으면 않는 한 하나 너무 느린 안 : 또는

MATCH (d:Decision)<-[:DEFINED_BY]-(c:Criterion) 
WHERE id(d) = {decisionId} 
    AND c.name = {name} 
OPTIONAL MATCH (c)<-[:CONTAINS]-(cg:CriterionGroup) 
WITH c, extract(g IN collect(cg) | id(g)) AS cgIds 
WHERE CASE 
     WHEN {criterionGroupId} IS NULL THEN size(cgIds) = 0 
     ELSE {criterionGroupId} IN cgIds 
     END 
RETURN c 

, 당신이 당신의 Repository에이 방법을 가질 수 직접 각각의 경우를 관리 할 수 ,

MATCH (d:Decision)<-[:DEFINED_BY]-(c:Criterion) 
WHERE id(d) = {decisionId} 
    AND c.name = {name} 
    AND NOT (c)<-[:CONTAINS]-(:CriterionGroup) 
RETURN c 

criterionGroupId가 널 및

MATCH (d:Decision)<-[:DEFINED_BY]-(c:Criterion), 
     (c)<-[:CONTAINS]-(cg:CriterionGroup) 
WHERE id(d) = {decisionId} 
    AND c.name = {name} 
    AND id(cg) = {criterionGroupId} 
RETURN c 
,617 사용

그렇지 않으면

+0

감사합니다. 하나의 Criterion과 관련된 CriterionGroup (수천은 아님)을 가질 것입니다.하지만 수천 개의 Criterion, Decision 및 CriterionGroup이 있습니다. 하나의 CriterionGroup은 수십 개의 Criteria를 가질 수 있습니다. 따라서 성능 측면에서 보면 단일 쿼리로 솔루션 번호 하나를 사용하는 것이 안전합니까? – alexanoid

+0

'Criterion' _to_ 0 또는 1' CriterionGroup'에서 건너 뛸 것이므로 단일 쿼리에 성능 문제가 없어야합니다. –

+0

고마워요! 쿼리가 완벽하게 작동합니다! – alexanoid