创建新节点并将关系添加到现有节点

Creating New Nodes and Adding Relationships to Existing

我有一个小图,它有 'Parent' 个节点(如定义 child 的 parent 的节点)和 'Child' 个节点(children of said parents). 我注意到我创建现有 children 兄弟姐妹的方式存在一个小问题,希望得到一些指导。

return client.Cypher
            .Match("(person:Person),(c:IdCounter)")
            .Where((Person person) => person.Email == 'shainefisher@hotmail.com')
            .Create("person-[:PARENT_OF]->(child:Child {name:'fred',dob:timestamp()})")
            .Set("child.timestamp = timestamp()")
            .Set("child.id = c.nextId")
            .Set("c.nextId = c.nextId + 1")
            .Return<Child>("child").Results.ToList();

这创建了一个 child,它有一个 parent 并创建了关系,这非常有效,正如其设计的那样。 然而,接下来是我遇到问题的地方:

return client.Cypher
            .Match("(child:Child)<-[:PARENT_OF]-(person:Person),(c:IdCounter)")
            .Where((Person person) => person.Email == 'shainefisher@hotmail.com')
            .Create("(child2:Child {name:'derf',dob:timestamp()})")
            .Set("child2.id = c.nextId")
            .Set("c.nextId = c.nextId + 1")
            .Create("(person)-[:PARENT_OF]->(child2)")
            .Create("(child2)-[:SIBLING_OF]->(child)")
            .Return<Child>("child2").Results.ToList();

现在,我第一次 运行 这个兄弟代码时,我得到了第二个 child,链接到 parent,并链接到它的兄弟代码,所以在大多数情况下,这将是很好,但我有 4 children :/

第二次我 运行 我创建了 2 children 兄弟代码(相同的 child 两次,具有连续的 id),并且它们链接到 parent (PARENT_OF),但是 1 个新的 child 链接到 1 个现有的 child (SIBLING_OF),第二个新的 child 链接到另一个现有的 child(SIBLING_OF)。 编辑:这是使用的 Cypher 和 运行 两次兄弟代码后的结果图:http://ec2-52-89-85-67.us-west-2.compute.amazonaws.com/imagedata/capture.png
我希望创建 1 个新的 child,并为原始匹配语句中收集的 children 创建一个 SIBLING_OF 关系,但这不是我得到的。

谢谢

所以,我解决了这个问题,这完全是一个顺序问题,我没有意识到这一点。为了做我想做的事,我不得不使用这个:

create(child2:Child{FirstName:'Sarah',LastName:'Fisher',DateOfBirth:1281222000000,id:118,timestamp:timestamp(),x120:'/',x160:'/',x240:'/',x320:'/',x480:'/',x640:'/',thumbnail:'/',Gender:'Female'})
with child2
match (person:Person{Email:'shainefisher@hotmail.com'})-[:PARENT_OF]-(child:Child)
create unique(person)-[:PARENT_OF{timestamp:timestamp()}]->(child2)
create(child2)-[:SIBLING_OF{timestamp:timestamp()}]->(child)
return person,child,child2

如您所见,我现在先创建子项,然后使用 WITH 来创建关系,但我还需要在 PARENT_OF 关系上使用 CREATE UNIQUE 来停止重复。

问题已解决,谢谢:)

这应该让你继续:

client.Cypher
    .Match("(c:IdCounter)")
    .Create("(child2:Child {name:'derf',dob:timestamp()})")
    .Set("child2.id = c.nextId")
    .Set("c.nextId = c.nextId + 1")
    .With("child2")
    .Match("(child:Child)<-[:PARENT_OF]-(person:Person)")
    .Where((Person person) => person.Email == "shainefisher@hotmail.com")
    .CreateUnique("(person)-[:PARENT_OF]->(child2)")
    .CreateUnique("(child2)-[:SIBLING_OF]->(child)")
    .Return<Child>("DISTINCT child2");

或者至少它创造了我认为是你所追求的东西 - 所有 children 链接在一起,parent 每个 child.