2014-12-10 64 views
0

的路徑自動加載我有大量的是由誰訪問網站的用戶的數據。每次訪問都有時間戳。使用http://jexp.de/blog/2012/10/parallel-batch-inserter-with-neo4j/劇本,我創建了針對每個頁面的Neo4j和Groovy:可變長度

U1-->T1-->P1 
| 
--->T2-->P2 
etc. 

一個單獨的路徑現在的圖形,我想有以下結構:

U1-> T1-> P1-> T2- > P2 ......

顯然,每個用戶訪問不同的頁數。我有一個看起來像這樣的文件:

person,time,place 
U1,t1,P1 
U1,t2,P2 
U1,t3,P3 
U2,t4,P1 
U2,t5,P6 

每個用戶序列由訪問時間排序,所以t1about我 - >博客等

  1. 是上述結構U1-> T1-> P1 - > T2-> P2一個好的方法? (我有大約30萬個條目)
  2. 我需要修改的常規腳本,以便它可以自動在同一序列中添加關係和節點。我正在考慮保留以前的用戶ID在內存中,如果新的用戶ID =舊ID,那麼我只會添加關係和地點。否則,我將創建一個新用戶並構建新路徑。

回答

3

我假設你的節點被標記爲U爲用戶,爲T時間戳和P的頁面。

  1. 您不需要時間戳節點。您可以將時間戳值放在UP之間的關係中。這將大大減少節點和關係的數量。

    例如,而不是這個(我彌補的關係 類型):

    (:U)-[:VISITED_AT]->(:T {timestamp: 123})-[:PAGE]->(:P) 
    

    你可以利用這一點,這樣可以節省1個節點和每次訪問1間的關係:

    (:U)-[:VISITED {timestamp: 123}]->(:P) 
    
  2. 您描述的看起來很合理,但是您可以爲同一頁面創建多個節點(例如,示例文件中的P1,因爲它出現了兩次),而您確實希望每頁都有一個節點。另外,如果文件在U2行之後包含另一個U1行,則會創建第二個U1節點。爲了防止這樣的重複,你應該使用MERGE而不是CREATEUP節點。 MERGE只有在不存在的情況下才會創建節點,否則它只返回現有的節點。一旦擁有節點,您就可以繼續並將它們之間的關係(以時間戳作爲屬性)關聯在一起。

+0

對不起,我忘了提及,我已經有用戶和頁面的唯一性約束。 – user201411 2014-12-11 07:01:50