2014-02-20 3 views
0

내 그래프에 점과 선이라고 불리는 노드가 있습니다.spring-data-neo4j의 데이터 모델링

"NEXT"라는 두 가지 점을 연결하고 lineID (길이가 긴) 속성이있는 관계 유형이 있습니다. 라인 노드는 단순히 ID와 "루트"포인트에 대한 참조로 구성됩니다. 행을 탐색하려면 해당 루트 노드로 시작하여 NEXT 관계를 따르고 그 행의 행 ID는 lineID과 일치해야합니다. 우리는 누구의 루트 지점 ID (321)가 ID (123)와 선을 통과하는 경우 명확히하기 위해, 사이퍼 탐색은 다음과 같습니다

START n = node(321) 
MATCH (n)-[rel:NEXT*{lineID:123}]->(x) 
RETURN collect(rel) 

라인, 다음, 기본적으로 lineID 일치하는 다음의 관계의 연결리스트입니다 속성. 즉,이 목록을 선의 속성으로 유지하고 싶지는 않습니다. 선이로드 될 때 목록을 가로 지르는 방식으로 구성하려고합니다.

spring-data-neo4j에서 이것을 구현하기위한 나의 옵션은 무엇입니까? 특히, "lines"은 NodeEntity으로 존재해야하며, 그렇다면 무엇을 포함해야합니까? 라인이 항목에 다음 관계를 통해 관련되지 않기 때문에

@NodeEntity 
class Line { 
    @RelatedTo(type="ROOT") 
    Point root; 
    @RelatedToVia(type="NEXT") 
    Iterable<Item> list; 

가 매우 적합하지 않습니다 루트 지점입니다. 또한 NEXT 관계가 라인의 ID와 일치하는 lineID 속성을 가져야한다는 사실을 언급하지 못했습니다. 이는 몇몇 포인트가 여러 라인에 존재하기 때문에 중요합니다. 즉, 서로 다른 라인 ID로 여러 NEXT 관계를가집니다. 나는 그 솔루션이 @GraphTraversal로리스트에 주석을다는 것을 포함하는 직감을 가지고 있지만 그것이 어떻게 작동하는지 이해하지 못한다.

SDN의 데이터 모델링에 대해 머리를 감싸는 연습으로, 일반적으로 Neo4j 및 그래프 데이터베이스 주위에서 머리를 감싸는 컨텍스트에서이 작업을 주로 수행하고 있습니다. 내가 묻고있는 질문이 이러한 것들에 대한 나의 이해의 결함을 드러내는 경우 누군가가 지적 할 수 있다면 매우 감사하게 여길 것이다.

+0

샘플 그래프 다이어그램을 첨부 할 수 있습니까? 시각화하는 것이 더 낫습니다. –

답변

1

이 적당한 당신의 실체에 대한 모델이 될해야합니다

Set edges = line.getPoint().getEdges(); 

for (Edge edge: edges) { 
    if (edge.getLine().getId() == id) { 
     ... 
    } 

}

또는 같은 사이퍼 쿼리 : 그것은 쉽게에서와 같이 자바 프로그램 탐색 둘 수 있습니다

@NodeEntity 
class Point { 
    @GraphId 
    protected Long id; 

    @RelatedToVia(type="NEXT") 
    Set<Edge> edges; 
} 

@NodeEntity 
class Line { 
    @GraphId 
    protected Long id; 

    @RelatedTo(type="ROOT") 
    Point root; 
} 

@RelationshipEntity 
public class Edge { 
    @GraphId 
    protected Long id; 

    @StartNode private Point from; 
    @EndNode private Point to; 

    @RelatedTo(type="LINE") 
    Line line; 
} 

너는 열거했다.

+0

Beautiful. 나는 항상 좋은 답변을 해주었지만, 특히 도움이되었습니다. 그것은 내가 이미 모델링 한 것과 거의 동일합니다. 그리고 나는 올바르게 grokking하고 있다는 확신을 가지고 있습니다. :) – drewmoore