2016-12-15 10 views
0

Предположим, у меня есть 3 подграфа в Neo4j, и я хотел бы выбрать и удалить подсегмент целиком, если все узлы в подграфе соответствуют критериям фильтрации, которые значение свойства каждого узла < = 1. Однако, если есть atleast один узел в подграфе, который не соответствует критериям, тогда подграф не будет удален.Neo4j Cypher: сопоставить и удалить подграф, основанный на значении свойства node

В этом случае левый подграф будет удален, но правый подграф и средний будут оставаться. Правые не будет удалены, даже если она имеет некоторые узлы со значением 1, поскольку существует также узлы со значениями выше, чем 1.

UserIds и значения являются свойством узла.

enter image description here

Я буду благодарен, если кто-то может предложить мне Cypher запрос, который может быть использован, чтобы сделать это. Обратите внимание, что запрос будет отображаться на всем графике, который находится на всех трех подграфах или больше, если их больше.

+0

Под «подграфом», вы конкретно имеете в виду «отключенный подграф»? – cybersam

+0

Это поможет узнать, имеют ли все узлы одну и ту же метку, или если для этих узлов имеется несколько меток. Если да, то индексируется значение свойства? – InverseFalcon

+0

@InverseFalcon Есть узлы метки. и свойство value также индексируется. – sjishan

ответ

1

Спасибо за разъяснение, это сложное требование, и мне не сразу понятно, какой наилучший подход будет хорошо масштабироваться с большими графиками, поскольку большинство возможностей, похоже, являются дорогостоящими полными графическими операциями. Вероятно, нам понадобится несколько шагов, чтобы настроить график для более простого запроса позже. Я также предполагаю, что вы имеете в виду «отключенные подграфы», иначе этот ответ не будет работать.

Один запуск может заключаться в том, чтобы обозначать узлы как: Живые или: Мертвые, основанные на значении свойства. Это должно помочь, если все узлы имеют одну и ту же метку, и если есть индекс для свойства value для этого ярлыка, поскольку наши операции совпадения могут использовать индекс вместо того, чтобы выполнять полное сканирование меток и сравнение свойств.

MATCH (a:MyNode) 
WHERE a.value <= 1 
SET a:Dead 

И отдельно

MATCH (a:MyNode) 
WHERE a.value > 1 
SET a:Alive 

Тогда ваш запрос, чтобы отметить узлы для удаления будет:

MATCH (a:Dead) 
WHERE NOT (a)-[*]-(:Alive) 
SET a:ToDelete 

И если все выглядит хорошо с узлами вы помеченных для удаления, вы может выполнить операцию удаления, используя apoc.periodic.commit() из процедур APOC для пакетной операции, если это необходимо.

MATCH (a:ToDelete) 
DETACH DELETE a 

Если операции по несвязанным подграфам собираются быть общими, я настоятельно рекомендую с помощью специального узла, подключенного к каждому подграфа вы создаете (например, одного: узел кластера во главе подграфа), так что вы можете начать такие операции на узлах кластера, которые значительно ускорили бы подобные запросы, поскольку ваши операции запроса будут выполняться для каждого кластера, а не для: мертвого узла.

+0

Большое спасибо. Он работает отлично. В оригинальном варианте использования у меня будет около 70 миллионов узлов, и каждый день мне может понадобиться удалить 4-6 миллионов узлов.Поэтому я надеюсь, что он будет масштабироваться. Идея: Cluster node довольно интересна, но я не уверен, насколько это возможно, потому что у меня будут новые узлы, которые появляются каждый день. Таким образом, каждый раз, когда узел добавляется, потребуется поиск, чтобы узнать, нужно ли добавлять узел кластера или нет. – sjishan

+0

Когда вы добавляете новые узлы, знаете ли вы, будут ли они связаны с существующими кластерами или если они будут запускать новые собственные кластеры? Если вы это знаете, вы можете включить шаг, на котором вы создаете узел: Cluster прямо перед добавлением нового узла. Кроме того, ваши ценности когда-либо будут меняться? Если они останутся прежними, возможно, стоит добавить любой подходящий ярлык (: Alive или: Dead, хотя: Dead, вероятно, следует использовать другое имя) во время создания. Если они будут изменены, вам может потребоваться удалить эти метки после завершения операции удаления, чтобы вы не работали с устаревшими данными. – InverseFalcon

+0

Во время добавления новых узлов он не может сформировать новый кластер или сформировать новый кластер. Вот почему я использую для этого операцию «merge». Вы можете рассматривать значение как временную метку, это не изменится, и удаление происходит на основе метки времени. Например, допустим, что я поддерживаю 10-дневные графические данные, поэтому каждый день будет новое удаление и вставка. Новые узлы в каждый день могут складываться со старым кластером или самим создавать новый кластер. – sjishan

 Смежные вопросы

  • Нет связанных вопросов^_^