我的代码如下,是否有更好的方法来编写此查询,以便我们不会出现约束违规异常?因为我们有一个独特的约束:SiteEntry(Url)和errors = exceptions
代码:
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()
由于
答案 0 :(得分:1)
您的问题没有提供足够的信息来完全了解您的情况,但这里有一些可能有用的信息。
如果您的数据库具有唯一性约束或索引(它会自动创建唯一性约束),那么涉及此类约束的节点MERGE
将导致如果出现以下情况,则会发生约束违规:(a)DB没有具有所有指定属性的节点,但(b)它的节点具有一些指定属性 - 并且包含受约束的属性。在这种情况下,MERGE
既不能返回现有节点,也不能在不违反唯一性约束的情况下创建新节点。
例如,假设您的数据库具有唯一性约束,并且以这种方式定义节点:
CREATE CONSTRAINT ON (s:SiteEntry) ASSERT s.Url IS UNIQUE;
CREATE (s:SiteEntry { Url: "http://stackoverflow.com" });
然后,以下查询将创建约束违规。虽然没有完全匹配的节点,但唯一性约束阻止MERGE
创建新节点:
MERGE (s:SiteEntry { Url: "http://stackoverflow.com", SiteTitle:"SO" })
(顺便说一句,如果MERGE
向其他匹配节点添加新标签,则不会违反唯一性约束。)