Neo4J глубоко проверить график - PullRequest
0 голосов
/ 14 ноября 2018

БД имеют некоторое количество OrderItemType, которое имеет отношения между собой, например, НЕПРАВИЛЬНО и ТРЕБУЕТСЯ

Мы объединяем заказ, связывая с ним OrderItemType с отношением CONTAINS

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

Цель просто пытается вставить и получить отклонение, если она нарушает некоторые условия

Другой вариант - использование транзакции: 1. вставить элемент 2. загрузить график и проверить правила вручную 3. откатить, если обнаружите какие-либо проблемы

ОБНОВЛЕНИЕ Хорошо, я перефразирую вопрос со стандартными фильмамиобразец

позволяет установить некоторые отношения между актерами

CREATE (Keanu)-[:HATE]->(JackN),
(Keanu)-[:REQUIRE]->(LillyW),
(JamesM)-[:HATE]->(LillyW)

, теперь мы начинаем новый фильм, производящий

CREATE (RaiseOfCrazyDev:Movie {title:'RaiseOfCrazyDev', released:2020, tagline:'Crazy developer  conquer the world'})

и начинаем кастинг.сначала мы подписываем JackN и JamesM

CREATE (JackN)-[:ACTED_IN {roles:['Father']} ]->(RaiseOfCrazyDev),
(JamesM)-[:ACTED_IN {roles:['BadGuy']} ]->(RaiseOfCrazyDev)

теперь мы пытаемся подписать Keanu

CREATE (Keanu)-[:ACTED_IN {roles:['Dev']} ]->(RaiseOfCrazyDev)

Ноон должен потерпеть неудачу, так как Keanu ненавидит JackN , и Keanu требуют LillyW

, поэтому мы удаляем JackN и добавляем вместо него Keanu и LillyW

MATCH (:JackN)-[r:ACTED_IN]-(:RaiseOfCrazyDev) DELETE r
CREATE (Keanu)-[:ACTED_IN {roles:['Dev']} ]->(RaiseOfCrazyDev),
(LillyW)-[:ACTED_IN {roles:['StepSister']} ]->(RaiseOfCrazyDev)

, но теперь снова происходит сбой, потому что JamesM ненавидит LillyW

, поскольку Киану играет главную роль в нашем фильме, мы увольняем Джеймса

MATCH (:JamesM)-[r:ACTED_IN]-(:RaiseOfCrazyDev) DELETE r

Итак, если перефразировать:

  • Не должно быть никаких ненавистных отношений междулюбые два актера, прикрепленные к одному фильму
  • Для всех актеров их ОБЯЗАТЕЛЬНЫЕ отношения должны быть актерами и в этом фильме.

Вопрос: Каков наилучший способ и место для проверки таких условий

1 Ответ

0 голосов
/ 15 ноября 2018

Я предполагаю, что проблемных ситуаций, подобных следующим, в БД не существует: a требует b, а b требует c, но c ненавидит a. (Хотя такие ситуации могут существовать в реальной жизни :-)). Я также предполагаю, что узлы актеров имеют метку Actor и свойство name.

Этот запрос должен помочь вам начать. Он сообщит вам, можно ли добавить актера (я предполагаю, что actorName и title передаются как параметры ). Он также вернет список текущих участников ролей, которым противостоят «требуемые» актеры (включая основного актера, которого вы хотите добавить, и всех актеров, требуемых требуемыми актерами и т. Д.), И список требуемых актеров, против которых выступили текущие участники броска:

MATCH (a:Actor {name: $actorName}), (m:Movie {title: $title})
OPTIONAL MATCH p=(a)-[:REQUIRE*]->(:Actor)
WITH a, m, NODES(p) AS reqs
UNWIND reqs AS req
WITH DISTINCT a, m, reqs, req
OPTIONAL MATCH (req)-[:HATE]->(h:Actor)
WITH a, m, reqs, COLLECT(DISTINCT h) AS hatedByReq
OPTIONAL MATCH (m)<-[:ACTED_IN]-(x:Actor)
OPTIONAL MATCH (x)-[:HATE]->(y:Actor)
WITH a, m, reqs, hatedByReq, COLLECT(x) AS cast, COLLECT(DISTINCT y) AS hatedByCast
WITH a, m, [c IN cast WHERE c IN hatedByReq] AS reqOpposes, [r IN reqs WHERE r IN hatedByCast] AS castOpposes
RETURN a, m, reqOpposes, castOpposes, (SIZE(reqOpposes) = 0 AND SIZE(castOpposes) = 0) AS okToAddActors

Результат, используя ваши данные выборки:

╒════════════════╤══════════════════════════════════════════════════════════════════════╤══════════════════╤═══════════════════╤═══════════════╕
│"a"             │"m"                                                                   │"reqOpposes"      │"castOpposes"      │"okToAddActors"│
╞════════════════╪══════════════════════════════════════════════════════════════════════╪══════════════════╪═══════════════════╪═══════════════╡
│{"name":"Keanu"}│{"title":"RaiseOfCrazyDev","tagline":"Crazy developer  conquer the wor│[{"name":"JackN"}]│[{"name":"LillyW"}]│false          │
│                │ld","released":2020}                                                  │                  │                   │               │
└────────────────┴──────────────────────────────────────────────────────────────────────┴──────────────────┴───────────────────┴───────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...