Ограничение периодической фиксации Neo4j Apoc не работает

Я пытаюсь удалить все узлы со степенью, равной или меньшей 1, но это не работает. Мой запрос выглядит следующим образом

CALL apoc.periodic.commit(" 
MATCH (n:RoadPoint)-[:ROAD_SEGMENT]-(m:RoadPoint) 
WHERE NOT (:Depot)-[:LOCATED_AT]->(n) 
WITH n , COUNT(DISTINCT m) AS c 
WHERE c <= 1 
WITH n limit {limit}
DETACH DELETE n 
RETURN COUNT(*)
", {limit:1000})

person Awais Mushtaq    schedule 08.07.2019    source источник
comment
Имейте в виду, что apoc.periodic.commit() будет выполнять этот точный запрос снова и снова для каждого пакета, что означает, что он будет перепроверять одни и те же узлы снова и снова (те, которые не соответствуют вашим критериям) с каждым пакетом. Вместо этого вам действительно следует использовать apoc.periodic.iterate(). Идеальное использование для apoc.periodic.commit() — это когда вам не нужно фильтровать, а ваши совпадения удаляются или изменяются, чтобы они не сопоставлялись повторно в последующих пакетах (например, при удалении узлов метки или удалении метки с помеченных узлов).   -  person InverseFalcon    schedule 08.07.2019
comment
Кроме того, что вы имеете в виду, что это не работает? Как вы ожидаете, что LIMIT повлияет на этот запрос? Все, что нужно сделать, это определить размер партии для обработки.   -  person InverseFalcon    schedule 08.07.2019
comment
Можете объяснить, что не работает? Ничего не удаляется? Или только 1000? Или что-то другое ?   -  person logisima    schedule 08.07.2019
comment
мой запрос не удалял ни одного узла, хотя у меня есть узлы со степенью 1. Я использую Limit для пакетной обработки узлов, чтобы избежать ошибок из-за ограниченного ОЗУ.   -  person Awais Mushtaq    schedule 08.07.2019
comment
@InverseFalcon, я думаю, что apoc.periodic.commit() был бы лучшим в моем случае, потому что мне просто нужно обработать те узлы, которые имеют первую степень, в случае apoc.periodic.iterate() мне нужно пройти все миллион узлов в пакетном режиме , затем проверка степени и удаление. Что вы думаете об этом?   -  person Awais Mushtaq    schedule 09.07.2019


Ответы (1)


Вы можете попробовать этот запрос:

CALL apoc.periodic.commit(
  "MATCH (n:RoadPoint)
   WHERE 
    NOT (:Depot)-[:LOCATED_AT]->(n) AND
    size((n)-[:ROAD_SEGMENT]-(:RoadPoint)) <=1
   WITH n LIMIT $limit
   DETACH DELETE n 
   RETURN COUNT(*)", 
  {limit:1000}
)

Это должно работать, а также быть намного быстрее благодаря функции size, которая в этом случае использует статистику степени, хранящуюся на каждом узле.

person logisima    schedule 08.07.2019
comment
решения выглядят лучше, но в моем случае ребра - это оба пути, так как я могу определить разные, потому что мне просто нужно подсчитать ребра с уникальными узлами - person Awais Mushtaq; 08.07.2019
comment
Если вам действительно нужно отдельное, вы должны использовать свой запрос, но это также означает, что у вас много отношений между двумя узлами. - person logisima; 08.07.2019
comment
Я думаю, что мне следует использовать Different, потому что некоторые узлы имеют двунаправленные ребра, а некоторые — однонаправленные. В вашем запросе он не будет охватывать узлы, которые имеют степень один, но также имеют двунаправленные ребра. Да, я хочу использовать свой запрос, но лимит не работает, он возвращает мне 0 обновлений - person Awais Mushtaq; 09.07.2019
comment
И если вы выполните запрос для поиска узлов со степенью 1 (замените with .. limit на return ... limit и удалите то, что у вас есть после), у вас есть какой-то результат? - person logisima; 09.07.2019