Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当节点已存在时,在NEO4J中使用“展开”创建多个节点_Neo4j_Cypher - Fatal编程技术网

当节点已存在时,在NEO4J中使用“展开”创建多个节点

当节点已存在时,在NEO4J中使用“展开”创建多个节点,neo4j,cypher,Neo4j,Cypher,我正在使用“展开”在NEO4j中创建多个节点。问题是,如果其中一个节点是重复的,它将被拒绝,整个查询将失败。如果相同节点已经存在,我希望能够在它们之间创建多个关系。例如,一个朋友可以收到来自同一个人的多个邀请。所以我有一个对象数组[{email:xxx@mail.com},{电邮:yyy@mymail.com},…]以及赞助商的电子邮件。电子邮件上存在限制,因此尝试创建副本将失败并拒绝整个查询。如果没有重复项,则以下操作可以正常工作 MATCH (s {email: 'sponsor@gmail

我正在使用“展开”在NEO4j中创建多个节点。问题是,如果其中一个节点是重复的,它将被拒绝,整个查询将失败。如果相同节点已经存在,我希望能够在它们之间创建多个关系。例如,一个朋友可以收到来自同一个人的多个邀请。所以我有一个对象数组[{email:xxx@mail.com},{电邮:yyy@mymail.com},…]以及赞助商的电子邮件。电子邮件上存在限制,因此尝试创建副本将失败并拒绝整个查询。如果没有重复项,则以下操作可以正常工作

MATCH (s {email: 'sponsor@gmail.com'})
UNWIND $arrayOfObjects as invitees
CREATE (i:Invitee) MERGE (s)-[r:INVITED {since: timestamp()}]->(i)
SET i=invitees

我尝试过用MERGE替换CREATE,认为MERGE会找到匹配项并继续创建关系,但没有成功。我仍然收到重复错误。除了在执行查询之前清理arrayOfObjects之外,还有其他方法吗?我希望复制不会失败,而是与现有的Invitee节点建立关系

您需要将:Invitee节点与被邀请者电子邮件合并。现在,您正在创建空的:Invitee节点,并且仅在创建这些节点后设置电子邮件地址。您需要将它们与电子邮件地址合并。你也应该在你的第一场比赛中使用一个标签,否则它会出现AllNodesScan…我现在假设它是:Invitee,但请用任何有意义的标签替换

MATCH (s:Invitee {email: 'sponsor@gmail.com'})
UNWIND $arrayOfObjects as invitee
MERGE (i:Invitee {email:invitee.email}) 
CREATE (s)-[r:INVITED {since: timestamp()}]->(i)

您需要将:Invitee节点与被邀请者电子邮件合并。现在,您正在创建空的:Invitee节点,并且仅在创建这些节点后设置电子邮件地址。您需要将它们与电子邮件地址合并。你也应该在你的第一场比赛中使用一个标签,否则它会出现AllNodesScan…我现在假设它是:Invitee,但请用任何有意义的标签替换

MATCH (s:Invitee {email: 'sponsor@gmail.com'})
UNWIND $arrayOfObjects as invitee
MERGE (i:Invitee {email:invitee.email}) 
CREATE (s)-[r:INVITED {since: timestamp()}]->(i)
[已编辑]

您的合并可以匹配任何现有的被邀请者,并且您的集合可以尝试将其电子邮件值更改为非唯一值。这可能就是您得到约束冲突的原因

如果您只希望每个受邀请者具有最新时间戳的单个受邀请关系,则此查询可以执行您想要的操作:

MATCH (s {email: 'sponsor@gmail.com'})
UNWIND $arrayOfObjects as invitee
MERGE (i:Invitee {email: invitee.email})
ON CREATE SET i = invitee
MERGE (s)-[r:INVITED]->(i)
ON CREATE SET r.since = timestamp()
此查询假定arrayOfObjects中的每个映射都包含唯一的电子邮件属性值。您还应该在:Inviteeemail上创建或,以加快第一次合并

指定当前时间戳的MERGE s-[r:invested{since:timestamp}]->i子句存在缺陷,因为它不会检测到具有较旧的自值的现有关系,因此几乎总是会创建新关系。MERGE s-[r:invested]->i子句仅在不存在关系的情况下创建关系

或者,如果要跟踪每个邀请的时间戳,可以将since值设置为时间戳数组,如下所示:

MATCH (s {email: 'sponsor@gmail.com'})
UNWIND $arrayOfObjects as invitee
MERGE (i:Invitee {email: invitee.email})
ON CREATE SET i = invitee
MERGE (s)-[r:INVITED]->(i)
ON CREATE SET r.since = [timestamp()]
ON MATCH SET r.since = r.since + timestamp()
[已编辑]

您的合并可以匹配任何现有的被邀请者,并且您的集合可以尝试将其电子邮件值更改为非唯一值。这可能就是您得到约束冲突的原因

如果您只希望每个受邀请者具有最新时间戳的单个受邀请关系,则此查询可以执行您想要的操作:

MATCH (s {email: 'sponsor@gmail.com'})
UNWIND $arrayOfObjects as invitee
MERGE (i:Invitee {email: invitee.email})
ON CREATE SET i = invitee
MERGE (s)-[r:INVITED]->(i)
ON CREATE SET r.since = timestamp()
此查询假定arrayOfObjects中的每个映射都包含唯一的电子邮件属性值。您还应该在:Inviteeemail上创建或,以加快第一次合并

指定当前时间戳的MERGE s-[r:invested{since:timestamp}]->i子句存在缺陷,因为它不会检测到具有较旧的自值的现有关系,因此几乎总是会创建新关系。MERGE s-[r:invested]->i子句仅在不存在关系的情况下创建关系

或者,如果要跟踪每个邀请的时间戳,可以将since值设置为时间戳数组,如下所示:

MATCH (s {email: 'sponsor@gmail.com'})
UNWIND $arrayOfObjects as invitee
MERGE (i:Invitee {email: invitee.email})
ON CREATE SET i = invitee
MERGE (s)-[r:INVITED]->(i)
ON CREATE SET r.since = [timestamp()]
ON MATCH SET r.since = r.since + timestamp()

提交的两个答案都是好答案。我在提交这个答案时,对后来的人来说,有一些细微的差别。该问题的主要目的是能够为尚未接受邀请的朋友创建多个邀请,并能够可视化这些邀请。以下是我决定的:

WITH ['tom@abc.com', 'tony@mymail.com',michael@gmail.com'] AS coll
UNWIND coll AS invitee
WITH DISTINCT invitee
MATCH (s:Sponsor {email: 'mary@gmail.com'})
MERGE (i:Invitee {email: invitee})
CREATE (s)-[r:INVITED {since: timestamp()}]->(i)
RETURN r;   

这使我能够为发送给同一个人的每个邀请创建多个关系,但前提是在不同的时间发送…我可以轻松查看

提交的两个答案都是好答案。我在提交这个答案时,对后来的人来说,有一些细微的差别。该问题的主要目的是能够为尚未接受邀请的朋友创建多个邀请,并能够可视化这些邀请。以下是我决定的:

WITH ['tom@abc.com', 'tony@mymail.com',michael@gmail.com'] AS coll
UNWIND coll AS invitee
WITH DISTINCT invitee
MATCH (s:Sponsor {email: 'mary@gmail.com'})
MERGE (i:Invitee {email: invitee})
CREATE (s)-[r:INVITED {since: timestamp()}]->(i)
RETURN r;   

这使我能够为发送给同一个人的每个邀请创建多个关系,但前提是在不同的时间发送…我可以轻松查看

如问题所述,我确实在放松后使用了合并,但我仍然收到带有电子邮件xxxx的节点123“已存在”。是的,我希望它能与tra建立新的关系
检查向同一受邀者发送了多少邀请…..我将仔细检查我的代码您的合并可以匹配任何现有受邀者,并且您的集合可以尝试将其电子邮件值更改为不再唯一。此外,请参阅我的更新答案,以了解如何跟踪每个邀请的建议。如问题中所述,我确实在放松后使用了合并,但我仍然收到带有电子邮件xxxx的节点123。是的,我希望它创建一个新关系,以跟踪向同一受邀者发送的邀请数量……我将仔细检查我的代码您的合并可以匹配任何现有受邀者,并且您的集合可以尝试将其电子邮件值更改为不再唯一。另外,请参阅我的更新答案,以了解如何跟踪每个邀请的建议。@InverseFalcon…是的,我确实尝试了问题中所述的方法,但如上所述,我遇到了重复错误…我将再次检查。另外,感谢标签提醒…我实际上使用了一个标签,但是您的提醒确实改善了问题+1上次合并没有太大意义,因为当前时间戳可能与现有关系的时间戳匹配。因此,结果是不确定的——你有时可能得不到新的关系。如果用例总是想要一个新的关系,那么CREATE将更有意义,更有效率CREATE@InverseFalcon...Yes我确实尝试了这个问题,但我得到了一个重复的错误,如上所述…我会再次检查。另外,感谢标签提醒…我实际上使用了一个标签,但是您的提醒确实改善了问题+1上次合并没有太大意义,因为当前时间戳可能与现有关系的时间戳匹配。因此,结果是不确定的——你有时可能得不到新的关系。如果用例总是想要一个新的关系,那么CREATE将更有意义,更高效。没错,我将把它改为CREATE