2017-07-28 90 views
2

我試圖複製下面的SQL查詢的行爲的Neo4j刪除所有,但

DELETE FROM history 
WHERE history.name = $modelName AND id NOT IN (
    SELECT history.id 
    FROM history 
    JOIN model ON model.id = history.model_id 
    ORDER BY created DESC 
    LIMIT 10 
) 

我嘗試了很多不同的查詢的一些查詢的前k個節點,但基本上我一直在努力結合找到TOP-k元素。這是我得到解決方案最接近的。

MATCH (h:HISTORY)-[:HISTORY]-(m:MODEL) 
WHERE h.name = $modelName 
WITH h 
MATCH (t:HISTORY)-[:HISTORY]-(m:MODEL) 
WITH t ORDER BY t.created DESC LIMIT 10 
WHERE NOT h IN t 
DELETE h 

隨着該查詢我的錯誤expected List<T> but was Node爲線WITH t ORDER BY t.created DESC LIMIT 10
我試過改變它COLLECT(t) AS t但是然後錯誤是expected Any, Map, Node or Relationship but was List<Node>

所以我幾乎卡住了。任何想法如何在Cypher中編寫這個查詢?

回答

3

遵循這種方法,您應該顛倒順序,匹配您的top-k節點,收集它們,並在匹配的節點不在集合中的情況下執行匹配。

MATCH (t:HISTORY)-[:HISTORY]-(:MODEL) 
WITH t ORDER BY t.created DESC LIMIT 10 
WITH collect(t) as saved 

MATCH (h:HISTORY)-[:HISTORY]-(:MODEL) 
WHERE h.name = $modelName 
AND NOT h in saved 
DETACH DELETE h 
+0

工程就像一個魅力,謝謝!就在離開筆記本電腦的時候,我認爲逆轉訂單可能是一個解決方案。此外,「DETACH DELETE」在這裏當然很重要。必須微笑,因爲你的用戶名符合解決方案:) – joe776