【问题标题】:Neo4jClient Create Unique results in multiple duplicate nodesNeo4jClient 在多个重复节点中创建唯一结果
【发布时间】:2013-09-11 11:37:22
【问题描述】:

我想知道是否有人可以帮助我了解 Create Unique 在 Neo4J 中的实际工作原理。我正在尝试将多个地址注册到一个托运人节点,我希望城市、州和国家在这些地址中是相同的,以便它们都指向同一个节点。但是问题是 Create Unique 会导致数据库中同一节点的多个实例。

这是我必须向托运人注册地址的功能,我使用同一个托运人节点多次调用该地址,但不同的地址指向同一个城市。

public Node<Address> RegisterShipperAddress(Node<Shipper> shipper,AddressType addressType ,Address address, City city, State state, Country country)
    {
        var shipperRef = shipper.Reference;
        var addressRef = neo4jClient.Cypher.Start(new { shipperNode = shipperRef }).CreateUnique("(shipperNode)-[r:HAS_ADDRESS { TypeName:{TypeName} }]->(addressRef{address})").WithParam("TypeName", addressType.TypeName).WithParam("address", address).Return<Node<Address>>("addressRef").Results.FirstOrDefault();
        var cityRef = neo4jClient.Cypher.Start(new { addressNode = addressRef }).CreateUnique("(addressNode)-[:BELONGS_TO_CITY]->(cityRef{cityData})").WithParam("cityData", city).Return<Node<City>>("cityRef").Results.FirstOrDefault();
        var stateRef = neo4jClient.Cypher.Start(new { cityNode = cityRef }).CreateUnique("(cityNode)-[:BELONGS_TO_STATE]->(stateRef{stateData})").WithParam("stateData", state).Return<Node<State>>("stateRef").Results.FirstOrDefault();
        var countryRef = neo4jClient.Cypher.Start(new { stateNode = stateRef }).CreateUnique("(stateNode)-[:BELONGS_TO_COUNTRY]->(countryRef{stateData})").WithParam("stateData", state).Return<Node<Country>>("countryRef").Results.FirstOrDefault();
        return addressRef;
    }

现在假设我用不同的地址调用上述方法,如下所示:

//第一次通话....

RegisterShipperAddress(shipperNode,
                new AddressType { TypeName = "REGISTRED" },
                new Address
                {
                    Address1 = "151/1 ABC Main",
                    Address2 = "My PO 1234",
                    Email = "abc@abc.com",
                    Mobile = "123456",
                    Phone = "123456"
                },
                new City { InternalId = 1, Label = "MyCity" },
                new State { InternalId = 1, Label = "MyState" },
                new Country { InternalId = 1, Label = "MyCountry" }
                );

// 第二次调用

RegisterShipperAddress(shipperNode,
                new AddressType { TypeName = "BILLING" },
                new Address
                {
                    Address1 = "1 X Main Road",
                    Address2 = "PO 555",
                    Email = "abc@abc.com",
                    Mobile = "123456",
                    Phone = "123456"
                },
                new City { InternalId = 1, Label = "MyCity" },
                new State { InternalId = 1, Label = "MyState" },
                new Country { InternalId = 1, Label = "MyCountry" }
                );

我最终得到同一个节点的多个实例。只是想知道是否可以使用 Cypher 的 Create Unique 子句来实现这一点。

这是我看到的那种如果图表..

               --> (Address1)-->(MyCity)-->(MyState)-->(MyCountry)

(根)-->(发货人)||

               --> (Address2)-->(MyCity)-->(MyState)-->(MyCountry)

在一个事务中一次创建多个节点的最佳方法是什么,我认为在上面的代码中,每个节点都是在一个单独的事务中创建的。

【问题讨论】:

    标签: neo4j cypher neo4jclient


    【解决方案1】:

    不鼓励在 Cypher 1.9 中使用CREATE UNIQUE。如果可以,请使用 Neo4j 2.0.0.M05 ++ 并为城市、州和国家创建唯一约束,请参阅 http://docs.neo4j.org/chunked/snapshot/query-constraints.html#constraints-create-uniqueness-constraint 然后 MERGE城市节点,创建地址。这是一个图形学家的例子:

    http://gist.neo4j.org/?6549962

    【讨论】:

    • 谢谢彼得,现在我明白为什么它不能按我预期的方式工作了。此外,我将其视为 1.9.X 版本中无法使用 Rest API 一次创建所有节点。
    • MERGE (joe:City{name:'Joe'}) 应该是 :Person
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多