Исключения при ограниченном нарушении
Мой код ниже. Есть ли лучший способ написать этот запрос, чтобы мы не получали исключения нарушения ограничений? видя, как у нас есть уникальное ограничение:SiteEntry(Url) и ошибки = исключения
Код:
GraphRepository.WriteClient.Cypher
.With("{uris} as links")
.Unwind("links", "link")
.Merge("(site:SiteEntry:InNetwork{Url:{url},SiteTitle:{st}})")
.Merge("(s2:SiteEntry{Url:link.Url})")
.With("site,s2,link")
//next line formerly createunique
.Merge("(site)-[:LinksTo{AnchorText:link.AnchorText}]->(s2)")
.WithParams(
new {url = uriResponse.Url, uris = uriResponse.OutLinks, st = uriResponse.SiteTitle})
.ExecuteWithoutResultsAsync()
Спасибо
1 ответ
Ваш вопрос не дает достаточно информации, чтобы полностью понять вашу ситуацию, но вот некоторая информация, которая может помочь.
Если ваша БД имеет ограничение уникальности или индекс (который автоматически создает ограничение уникальности), то узел MERGE
это включает в себя такое ограничение, что приведет к нарушению ограничения, если: (а) у БД нет узла со ВСЕМИ из указанных свойств, но (б) у него есть узел с НЕКОТОРЫМИ из указанных свойств - и те, которые включают в себя ограничение свойства. В этой ситуации MERGE
не может ни вернуть существующий узел, ни создать новый, не нарушая ограничение уникальности.
Например, предположим, что ваша БД имеет ограничение уникальности и узел определен следующим образом:
CREATE CONSTRAINT ON (s:SiteEntry) ASSERT s.Url IS UNIQUE;
CREATE (s:SiteEntry { Url: "http://stackru.com" });
Затем следующий запрос создаст нарушение ограничения. Хотя не существует полностью совпадающего узла, ограничение уникальности предотвращает MERGE
от создания нового узла:
MERGE (s:SiteEntry { Url: "http://stackru.com", SiteTitle:"SO" })
(Кстати, ограничение уникальности не нарушается, если MERGE
добавляет новую метку в другой соответствующий узел.)