2013-03-01 52 views
1

我是Neo4j和圖形數據庫的新手,但我在關係數據庫中有背景知識。如何在Neo4j中複製此SQL子查詢

我的問題是關於如何在Neo4j中高效地複製SQL Server查詢的請求。

我開始了一個新項目,我認爲它適合於Neo4j,因爲我需要存儲許多朋友類型的朋友關係。我使用Neo4j 1.8.1和C#編寫我的應用程序

我的項目的一部分有一個部分,其結構可與Twitter相媲美,這是我需要幫助的部分。

我將使用Twitter的比喻來解釋我的問題:

我有文字的斑點(微博)的列表,每個斑可在0,1或多個類別(哈希標籤)。與Twitter不同,我也有用戶鏈接到0,1或許多類別。

我設想看起來像這樣的曲線圖:

T =文本BLOB節點,C =類節點,U =用戶節點

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

當應用程序正在運行時,我估計會有大約10,000,000條記錄(我可能會比這更多地歸檔),大約100個類別和大約1000個用戶。

目前,我有一個簡單的SQL Server數據庫來測試這一點:

 

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

通過從文本表複製的設置DateAdded領域的TextCategory表,並添加索引到2個鏈接表,我可以運行以下查詢返回屬於該用戶預訂日期排列類別中的所有文本項:

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數據庫efficeintly中複製此查詢?在Cypher中可以這樣做嗎?

如果我使用的是這樣的:

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

(我的暗號技能還比較幼稚)

我可以通過文本節點掃描,但我不會能夠在使用索引用戶。我最終會檢查每個文本節點以查看它是否與用戶鏈接。

如果我掃描了鏈接到用戶的所有關係,我將無法利用文本節點上的日期排序索引來頁面結果,避免掃描所有節點以找到最早的10個例子。

正如我所提到的,我來自一個關係數據庫的背景,我仍然在關係數據庫的方式來思考這個問題,所以如果我的理論錯了,請告訴我。

回答

3

我認爲這相當直接轉化爲新。 你可以把索引中的用戶節點,然後查詢像你已經指出:

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 2013-03-01 14:47:18

+0

我不確定如何優化內部性能。不幸的是,據我所知,neo4j中沒有相應的訂購指數。從我個人的經驗來看,像SQL這樣的多重連接的查詢運行速度非常快,即使是大量的節點/關係。你在測試中獲得不合理的表現嗎?如果性能是一個真正的問題,那麼它有時會付出代價去運行gremlin查詢,而不是使用密碼。 – MrDosu 2013-03-01 15:02:19

+0

謝謝您的回答,並感謝您告訴我沒有訂購指數。整個應用程序只是在紙上,我只是想確保Neo4j適合我的需求。我會更加關注Gremlin,這是我到現在還沒有研究過的東西。 – user2123473 2013-03-01 15:10:29