2017-12-28 60 views
0

저는 특히 nosql 데이터베이스와 OrientDB를 시작했습니다. 필자의 이전 경험은 SQL Server를 주로 사용하는 관계형 데이터베이스입니다.OrientDb - 그래프를 사용하여 여러 정점 중에서 선택하십시오.

는 MSSQL에서,이 같은 수행 할 수 있습니다

SELECT s.url, p.title 
FROM Site s 
JOIN Page p ON s.Id = p.SiteId 

을 그리고 자신이 속한 사이트의 URL과 함께 그것은 나에게 모든 페이지의 표를 줄 것이다에 :

url   | title 
---------------------------- 
site1.com | page1 
site1.com | page2 
site2.com | page1 

이제 OrientDb에서 양방향 관계의 경우 link을 사용해야하고 양방향 관계의 경우 edge을 사용해야합니다. 특정 페이지가 속한 사이트뿐만 아니라 어떤 페이지가 사이트에 속하는지 알고 싶기 때문에이 경우 가장자리를 사용하기로 결정했습니다. 사이트 및 페이지 클래스/버텍스는 비슷한 방식으로 이미 만들어져 있지만 유사한 결과 집합을 얻는 방법을 알 수는 없습니다. 문서 (https://orientdb.com/docs/2.2/SQL.html)에서 :

OrientDB는 하나의 클래스 만 대상으로 많은 테이블을 허용 SQL, 반대로 (클래스 의 테이블이 토론에 해당합니다) 할 수 있습니다. 당신이이 개 클래스에서 선택하려면 2 서브 쿼리를 실행하고 UNIONALL 기능

그들의 예를 SELECT FROM E, V 다음 SELECT EXPAND($c) LET $a = (SELECT FROM E), $b = (SELECT FROM V), $c = UNIONALL($a, $b)됩니다로 가입해야하지만 내가 원하는 게 아니에요. 그 결과는 다음과 같습니다.

url   | title 
---------------------------- 
site1.com | 
site1.com | 
site2.com | 
      | page1 
      | page2 
      | page1 

MSSQL과 같은 원본 결과 집합을 만들려면 어떻게해야합니까?

추가 고려 사항 : 내 훈련과 MSSQL 사용 경험은 데이터베이스 작업이 응용 프로그램 코드가 아니라 데이터베이스에서 수행되어야한다고 규정합니다. 예를 들어 s.urls.id 필드를 얻으려면 데이터베이스 호출을 한 다음 p.titlep.SiteId 필드를 얻기 위해 두 번째 호출을 수행 한 다음 응용 프로그램 코드에서이를 일치시킬 수있었습니다. 필자가 이것을 피하는 이유는 여러 데이터베이스 호출이 불필요한 정보를 반환하는 데 걸리는 시간보다 효율적이지 않기 때문입니다 (이 예에서는 site1.com가 두 번 반환됩니다).

OrientDb 또는 일반적으로 그래프/nosql 데이터베이스의 경우가 아닌가? 필요한 데이터 (예 : SELECT FROM Site WHERE Url = "site1.com"SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com")를 얻기 위해 두 번 별도의 호출을해야합니까?

답변

2

이 시도 감사 :

select Url, out("HasPages").title as title from Site unwind title 

그것이

감사

+0

찬란한 희망이 도움! 고맙습니다! 내 머리를 nosql/graphs 개념으로 둘러싼다고 생각합니다. 다시 한 번 감사드립니다! –