Добавление нового узла в базу данных, как автоматически обновлять ссылки на основе правил - PullRequest
0 голосов
/ 18 октября 2018

Пожалуйста, извините за простоту вопроса, возможно - я новичок!

У меня есть несколько тысяч узлов и несколько десятков отношений, но отношения в значительной степени основаны на ряде правил и логики.

Объяснить на примере: если у меня есть узлы, определенные как (c: CAT) и (d: DOG), и у каждого узла есть свойство, называемое size, т.е. c.size, d.size и т. Д., То яможет довольно легко запустить какой-нибудь скрипт Cypher для установки отношений между узлами на основе следующего правила

MATCH (c:CAT), (d:DOG) WHERE c.size<d.size
CREATE (c:CAT)-[r:SMALLER_THAN]->(d:DOG)
RETURN c,d

Это замечательно и все работает хорошо.Давайте предположим, что теперь я добавляю новый NODE

CREATE (c:CAT {type:"tiger", size:"4"})
RETURN c

Это не будет иметь никаких ссылок, но я хочу применить ту же логику, т.е.

CREATE (c:CAT)-[r:SMALLER_THAN]->(d:DOG)

Do I

  1. удалить все ссылки и воссоздать их - то есть применить правило ко всей системе
  2. запустить ту же команду Cypher, что и «MERGE», а не «CREATE», следовательно, предполагая, что существующие отношения не будут изменены, если в этом нет необходимостисделайте это.
  3. Найдите узлы, у которых нет ссылок, а затем выполните команду только для них

Я просто хочу обновить ссылки, когда добавляю новые узлы, потому что в то времяЯ знаю, что новый узел не будет иметь ссылок.В качестве альтернативы, если мне нужно изменить размер (: CAT) или (: DOG), ссылка должна обновляться автоматически.

Любой совет приветствуется.

1 Ответ

0 голосов
/ 18 октября 2018

Если вы делаете это только для узлов: CAT и: DOG, вы можете создавать отношения одновременно с созданием узла:

CREATE (c:CAT {type:"tiger", size:"4"})
MATCH (d:DOG)
WHERE c.size < d.size
CREATE (c)-[:SMALLER_THAN]->(d)

Если вы хотите создать противоположные отношения, гдеэто применимо, вам нужно будет использовать условные выражения, либо с помощью трюка FOREACH:

CREATE (c:CAT {type:"tiger", size:"4"})
WITH c
MATCH (d:DOG)
WITH c, collect(d) as dogs
FOREACH (d in [d in dogs WHERE c.size < d.size] |
 CREATE (c)-[:SMALLER_THAN]->(d))
FOREACH (d in [d in dogs WHERE c.size > d.size] |
 CREATE (c)<-[:SMALLER_THAN]-(d))

, либо вы можете использовать условные выражения APOC.

Что касается обновления размера узла, вам, вероятно, следует удалитьвсе: связи SMALLER_THAN, связанные с узлом, а затем с отдельным повторным сопоставлением узлов со всеми возможными узлами, к которым вы хотите подключиться, и создайте отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...