2014-06-23 29 views
1

是否與暗號的可能性不使用基於性能有一定的關係?查詢只使用關係沒有一個給定的屬性

我們有一個新的要求,指出關係不應該被硬刪除,但應該得到一個標誌,「刪除=真」,讓我們種有我們的節點的關係的審計線索。 (類似於X的朋友是Y的朋友,但是對於所有關係類型而言更復雜一點)

這是在一個密碼查詢中通過使用WHERE r.deleted = false而可行的,但是在更復雜的查詢中可能會遍歷4-5關係類型更難。

有沒有一種簡單的方法,只是說,Neo4j的不應該使用屬性「已刪除」設置爲true什麼關係?

回答

2

不完全符合您的要求,但您也可以將關係類型從SOMETHING更改爲SOMETHING_DELETED。然後當你指定遍歷時,你可以跳過這些關係。

+1

+1,好主意,獎勵效率 –

0

查詢這樣

(用戶) - [:朋友{刪除: '假'}] - >(F) - [:works_in {刪除: '假'} ] - (公司)

1

事實上,隨着圖模型的發展,保持deleted屬性很快變得難以管理:屬性會滲透到每個查詢中。據我所知,Neo4j沒有提供任何幫助。

不過,我已經受夠了albertoperdomo的做法成功。幾個月前的一些細節在a question I asked here

要替換要軟刪除節點的兩件事情:他們的標籤(因此他們不能直接查找)和他們的關係(因此他們不能從其他節點到達)。在我的例子中,我只是用一個下劃線(_)加上標籤和關係類型。

好處很明顯:您現有的查詢(可能!)安全,因爲軟刪除的節點不再被考慮(它們不能再被訪問,除非您明確地忽略關係類型,即(a)--(b)或東西)。

我也喜歡認爲這是實現軟刪除,因爲你有效地切斷你的圖件的最高效的方式 - 而不是在物業配套(即使它索引)。

有一個陷阱,但是。 替代沒有通用的方法標籤和關係。你不能,例如說一些沿線:

match (:Person {id: 123})-[r]-() 
set type(r) = '_' + type(r); 

你必須分別替換每個標籤和關係,每種類型的節點,你有。事情也變得很棘手,如果關係是可選的,因爲它很難在整個查詢(因此my initial question)的「扛」你的初始節點。

我解決了,這是由該查詢的不同部分串聯起來與UNION方式:

MATCH (review:Review {Id: {id}})<-[wrote:WROTE_REVIEW]-(owner) 
DELETE wrote CREATE (review)<-[:_WROTE_REVIEW]-(owner) 
UNION 
MATCH (review:Review {Id: {id}})-[evaluates:EVALUATES]->(product) 
DELETE evaluates CREATE (review)-[:_EVALUATES]->(product) 
UNION 
... 
UNION 
MATCH (review:Review {Id: {id}}) 
REMOVE review:Review") SET review:_Review; 

是的,你是MATCH荷蘭國際集團在每個子查詢的同一個節點,但我認爲對性能的影響如果你的屬性被索引,但主要是因爲你創建/讀取節點的次數比刪除它們多得多(否則,你的數據庫將會是空的!)是可以忽略不計的!

相關問題