2017-07-28 89 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