限制违规例外

时间:2015-03-16 16:49:59

标签: c# c#-4.0 neo4j c#-3.0 neo4jclient

我的代码如下,是否有更好的方法来编写此查询,以便我们不会出现约束违规异常?因为我们有一个独特的约束: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()

由于

1 个答案:

答案 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向其他匹配节点添加新标签,则不会违反唯一性约束。)