2017-02-06 18 views
0

我目前有一些代碼,通過查看各種數據集和模型之間的電子關係。例如,JSESSIONID。建模neo4j中的關係,當他們不知道最初

我想模擬每個用戶與他們必須提交唯一標識符的應用程序的交互。例如,電子郵件地址。

在應用程序的處理日誌中,我看到[email protected]使用帶有JSESSIONID asdfghjkl的應用程序。然後我看到[email protected]也使用JESSIONID asdfghjkl的應用程序。最後,我看到[email protected]使用JSESSIONID qwertyuiop。

在我的代碼中,我很容易處理日誌,並將[email protected][email protected]寫爲Nodes,然後在它們之間寫入JSESSIONID關係。

MERGE (a:EMAIL {label:[email protected]}) MERGE (b:EMAIL {label:[email protected]}) MERGE (a)-[:asdfghjkl]-(b) 

但是,我不知道在規模上做到這一點的最佳方式。 (即應用程序日誌大小爲1TB)。限制是內存 - 我無法找到所有使用asdfghjkl作爲SessionID而不處理所有數據的電子郵件地址,所以我無法通過內存限制寫出它們之間的關係。

我真的很想做的是如如下寫出來的東西,但是這顯然失敗:

MERGE (a:EMAIL {label:[email protected]}) (a)-[:asdfghjkl] 

再後來: MERGE(B:EMAIL {標籤:[email protected]} )(b) - [:asdfghjkl]

我可以在事後跟查詢創建這些關係嗎?

回答

1

聽起來像你應該將JSESSIONID建模爲節點而不是關係,因爲這將允許您將JSESSIONID鏈接到多個電子郵件地址,並且您可以在ID上添加一個唯一約束以進行快速查找。

MERGE (a:EMAIL {label:[email protected]}) 
MERGE (b:EMAIL {label:[email protected]}) 
MERGE (jsid:JSESSIONID {id:'asdfghjkl'}) 
MERGE (a)-[:jsid]->(jsid) 
MERGE (b)-[:jsid]->(jsid) 

您可以通過查詢找到所有:使用特定JSESSION ID EMAIL節點應該是相當快:

MATCH (email:EMAIL)-[:jsid]->(jsid:JSESSIONID {id:'asdfghjkl'}) 
RETURN email 
+0

不幸的是,我認爲你是對的,我已經傾斜的方式。因爲我的圖表可能會變得相當大,所以我希望能夠簡化它(至少用於圖形查看)。鑑於你建議的數據模型,有沒有什麼方法可以查詢我將JSESSION id作爲關係而不是節點?即,(a) - [:jsid] - (b)而不是(a) - (jsid) - (b)? – mzimmerman

+0

我不這麼認爲。特別是因爲關係需要兩個節點,所以在Neo4j中不允許懸掛關係,所以如果只有一個節點正在使用會話ID,那麼您將無法保存此信息。此外,你需要弄清楚這將如何擴展與多個電子郵件節點使用相同的ID。如果有5個,你如何模擬這個?互連所有5個節點?這似乎並不高效。你需要創建一些關係鏈。您也無法通過會話ID進行快速查找,至少不能使用模式索引。傳統索引雖然可以工作。 – InverseFalcon