Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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,当我对位置节点的地址有唯一的约束,但使用合并时,应该会发现它是否存在,并且只返回该地址其余部分的id时,我预先解释了为什么我会遇到这个Cypher地址的问题。我错过了什么 以下是我的声明: MERGE(l:Location{location_name:"Starbucks", address:"36350 Van Dyke Ave", city: "Sterling Heights",state: "MI", zip_code:"48312",type:"location",room_numbe

当我对位置节点的地址有唯一的约束,但使用合并时,应该会发现它是否存在,并且只返回该地址其余部分的id时,我预先解释了为什么我会遇到这个Cypher地址的问题。我错过了什么

以下是我的声明:

MERGE(l:Location{location_name:"Starbucks", address:"36350 Van Dyke Ave", city: "Sterling Heights",state: "MI", zip_code:"48312",type:"location",room_number:"",long:-83.028889,lat:42.561152})
CREATE(m:Meetup{meet_date:1455984000,access:"Private",status:"Active",type:"project",did_happen:"",topic:"New features for StudyUup",agenda:"This is a brainstorming session to come with with new ideas for the companion website, StudyUup. Using MatchUup as the base, what should be added, removed, or modified? Bring your thinking caps and ideas!"})
WITH m,l 
MATCH (g:Project{title_slug:"studyuup"}) MATCH (p:Person{username:"wkolcz"})
WITH m,l,g,p  
MERGE (g)-[:CREATED {rating:0}]->(m)
MERGE (m)-[:MEETUP_AT {rating:0}]->(l)-[:HOSTED_MEETUP]->(m)
MERGE (m)<-[:ATTENDING]-(p)
RETURN id(m) as meeting_id

您遇到了对
合并
的常见误解
MERGE
合并在单个
MERGE
子句中指定的所有内容。因此,操作顺序是:

  • 搜索包含所有指定属性的
    :Location
    节点
  • 如果找到,则返回节点
  • 如果未找到,请创建节点
  • 您的问题出现在步骤3。由于具有您指定的所有属性的节点不存在,它将转到步骤3并尝试创建具有所有这些属性的节点。这就是违反唯一性约束的时候

    最佳做法是在已约束为唯一的属性上进行合并,然后使用
    SET
    更新其他属性。就你而言:

    MERGE (l:Location {address:"36350 Van Dyke Ave"})
    SET l.location_name = "Starbucks",
         l.city = "Sterling Heights"
    ...
    
    同样的逻辑将应用于稍后在查询中合并的关系。如果整个模式不存在,它将尝试创建整个模式。这就是为什么您应该坚持以下最佳实践:

    MERGE (node1:Label1 {unique_property: "value"})
    MERGE (node2:Label2 {unique_property: "value"})
    MERGE (node1)-[:REL]-(node2)
    

    嘿,妮可!谢谢你的洞察力。我意识到我必须添加一个附加属性(或删除一个),该属性只导致部分匹配,然后导致与约束的冲突。谢谢这是一个非常有用的答案,我在尝试了一个投诉的
    加载CSV
    后发现了这个答案。我不明白这里说的是什么。。。我试着做一些和最后三行完全一样的事情。。。我希望能创建一个独特的
    node1
    ,但我最终得到了许多
    node1
    。我想要的是:创建
    node1
    如果它不存在,创建node2(我知道它不存在,但我还是使用MERGE),然后在2.PS之间创建一个(必须是新的)链接:即使我使用
    匹配节点,匹配节点,合并链接
    模式,我仍然会得到重复的
    node1
    …哦,我的糟糕。
    MERGE-MERGE-MERGE
    模式实际上有效,但我的数据库不干净。在我删除以前的节点后,一切正常。
    MERGE (node1:Label1 {unique_property: "value"})
    MERGE (node2:Label2 {unique_property: "value"})
    MERGE (node1)-[:REL]-(node2)