创建新节点并将关系添加到现有节点
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.
我有一个小图,它有 '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.