2013-03-01 4 views
1

저는 Neo4j 및 그래프 데이터베이스를 처음 사용하지만 관계형 데이터베이스에 배경 지식이 있습니다.Neo4j에서이 SQL 하위 쿼리를 복제 할 수 있습니까

내 질문 Neo4j에서 SQL Server 쿼리를 효율적으로 복제하는 방법에 대한 조언을 요청하십시오.

내가 저장해야 할 친구 유형의 관계가 많기 때문에 Neo4j에 적합한 새로운 프로젝트를 시작합니다. 내 응용 프로그램을 작성하려면 Neo4j 1.8.1 및 C#을 사용하고 있습니다.

내 프로젝트의 한 부분에는 Twitter와 비슷한 구조의 섹션이 있는데, 여기가 도움이 필요한 곳입니다. 나는 텍스트 모양 (트윗)의 목록을 가지고

각 덩어리는 0, 1 또는 여러 범주 (해시 태그) 일 수 있습니다

나는 내 문제를 설명하기 위해 트위터 비유를 사용합니다. Twitter와는 달리, 0, 1 또는 여러 카테고리에 연결된 사용자도 있습니다.

가 가

T는 = 텍스트 BLOB 노드, C = 카테고리 노드 응용 프로그램이 실행되면

T-------C-------U 
\_____/ \_____ 
/ \  \ 
T-------C-------U 
\_____ 
     \ 
T-------C-------U 
    _____/ \_____ 
/   \ 
T    U 

, 나는 추정, U는 = 사용자 노드가있을 것입니다 :

나는 이런 식으로 뭔가를 찾고 그래프를 임신 약 10,000,000 개의 레코드 (아마도 이보다 더 많은 아카이브가있을 것입니다), 약 100 개의 카테고리 및 약 1000 명의 사용자가 있습니다. 현재

나는이 테스트하는 간단한 SQL Server 데이터베이스가 다음 TextCategory 테이블에 텍스트 테이블에서 DateAdded 필드를 복사하고이 개 연결 테이블에 인덱스를 추가함으로써

 

    __________   ______________  ___________  ______________  ________ 
    |Text  |  |TextCategory |  |Category |  |UserCategory | |User | 
    |----------|  |--------------|  |-----------|  |--------------| |--------| 
    |TextId |-------|TextId  |------|CategoryId |-----|UserId  |----|UserId | 
    |Text  |  |CategoryId |  |Name  |  |CategoryId | |Name | 
    |DateAdded |  |DateAdded  |  |-----------|  |--------------| |--------| 
    |----------|  |--------------| 

을, 나는 다음을 실행할 수 있습니다 사용자가 날짜순으로 구독하는 범주에 속하는 모든 텍스트 항목을 반환하는 쿼리 : 현실에서

SELECT t.* 
FROM Text t 
    INNER JOIN tc TextCategory ON tc.TextId = b.TextId 
WHERE tc.CategoryId IN 
(
    SELECT CategoyId 
    FROM UserCategory 
    WHERE UserId = @UserId 
) 
ORDER BY tc.AddedDate 

나는 페이지 결과 만 간단하게하기 위해,이을 떠난 것입니다.

Neo4j 데이터베이스에서이 쿼리를 효율적으로 복제하려면 어떻게해야합니까? Cypher에서 이와 같은 서브 쿼리가 가능합니까?

I는 다음과 같이 사용하는 경우 :

u-[:SUBSCRIBES_TO]->c<-[:BELONGS_TO]-t 

이 (내 사이퍼 기술은 여전히 ​​매우 유아 있습니다) 나는 텍스트 노드를 스캔 할 수

을하지만 난에 색인을 사용할 수있게되지 않을 것 사용자. 각 텍스트 노드가 사용자에게 연결되었는지 확인하기 위해 검사를 마칠 것입니다.

사용자와 연결된 모든 관계를 검색 한 경우 텍스트 노드의 날짜 순서 색인을 사용하여 페이지 결과를 활용할 수 없으며 모든 노드를 검색하여 예를 들어 가장 빠른 10 개를 찾지 않도록 할 수 있습니다.

내가 언급 한 것처럼 RDBMS 배경에서 왔으며 여전히 관계형 데이터베이스 방식으로이 문제를 생각하고 있으므로 이론에 잘못이 있다면 알려 주시기 바랍니다.

답변

3

이것은 매우 직접적으로 neo로 해석됩니다. 당신은 이미 언급 한 것처럼 쿼리 다음 인덱스의 사용자 노드를 넣어 수 : 내가 뭔가를 놓친하지 않는 한

start u=users(<USERID>) match u-[:SUBSCRIBES_TO]->c<-[:BELONGS_TO]-t return t order by t.AddedDate skip(<SKIPPED>) limit(<PAGESIZE>) 

당신은 이미 그것을 대답했다.

+0

빠른 답변 주셔서 감사합니다. 내가 정말로 염려하는 것은이 쿼리의 속도와 효율성입니다. 이 쿼리를 실행하면 Neo4j가 사용자가 연결된 모든 텍스트 노드를 검색 한 다음 날짜순으로 정렬 한 다음 요청한 범위를 다시 가져옵니다. 사용자가 1,000,000 개가 넘는 텍스트 노드에 연결될 수 있습니다. 인덱스를 사용하여 텍스트 노드를 날짜순으로 스캔하여 최소 요구 사항 만 스캔 할 수 있습니까? – user2123473

+0

이것이 내부적으로 어떻게 최적화되어 있는지 확실하지 않습니다. 불행히도 neo4j에는 색인을 정렬하는 것과 동일한 기능이 없습니다. SQL의 다중 조인을 사용하는 이와 같은 개인적인 경험 쿼리에서 많은 수의 노드/관계에서도 매우 빠르게 실행됩니다. 테스트에서 불합리한 성능을 얻고 있습니까? 성능이 실제 관심사 인 경우 cypher를 사용하는 대신에 gremlin 쿼리를 사용하는 경우가 종종 있습니다. – MrDosu

+0

답변 해 주셔서 감사 드리며 주문 색인이 없다는 것을 알려 주셔서 감사합니다. 전체 응용 프로그램은 단지 Neo4j가 내 요구에 적합하다는 것을 확신하고 싶었던 순간에 종이 위에 있습니다. Gremlin에 대해 더 자세히 살펴볼 것입니다. 지금까지 공부하지 않은 것입니다. – user2123473

관련 문제