首先,抱歉我的英语非常糟糕,我是法国人:p
我目前正在从MySQL切换到Neo4j,我对我的脚本有一点疑问。
我有艺术家和音乐专辑;他们每个人(如果需要)链接(艺术家) - [:OWNS] - >(专辑)。
现在我开发了用于更新信息的API,我对此有一点“错误”:
如果不存在,我如何获得现有节点并创建它?
另一方面,我这样做:
MATCH (u:User) WHERE u.id='83cac821-1607-49a3-e124-07431ef375ce' MERGE (c:Country {name:'France'}) CREATE UNIQUE (u)-[:FROM]->(c) RETURN u,c;
所以,如果国家“法国”已经存在,neo4j将不会创建第二个......完美'因为我的国家没有ID ...
但对于艺术家和专辑,我需要一个唯一的标识符;我无法创建我的请求:
MATCH (ar:Artist) WHERE ar.id='83cac821-1607-49a3-e124-07431ef375ce' MERGE (al:Album {name:'Title01', id:'31efc821-1607-49a3-e124-074383ca75ce'}) CREATE UNIQUE (ar)-[:OWNS]->(al) RETURN ar,al;
通过这种方式,我需要知道相册'ID(在我的API中,我不知道!)。事实上,如果存在,我需要Neo4j获取专辑“Title01”,如果没有,则创建(使用全新的ID)。在我的例子中,如果我不提供ID,它可以获得专辑(如果存在);但如果没有,它会创建一个没有ID的新的...如果我发送一个ID,neo4j永远不会得到它(因为标题已经存在但不是这个特定的ID)。
(之前,在Mysql中我使用了多个请求:1°搜索,如果相册存在。如果是,则返回ID;如果不创建新的并返回ID。2°相同的艺术家.3°创建它们之间的链接...)
感谢您的帮助!
答案 0 :(得分:3)
MERGE
命令可以使用ON MATCH
和ON CREATE
进行扩展,请参阅http://docs.neo4j.org/chunked/stable/query-merge.html#_use_on_create_and_on_match。我想你必须要像
MATCH (ar:Artist) WHERE ar.id='83cac821-1607-49a3-e124-07431ef375ce'
MERGE (al:Album {name:'Title01'})
ON CREATE SET al.id = '31efc821-1607-49a3-e124-074383ca75ce'
CREATE UNIQUE (ar)-[:OWNS]->(al) RETURN ar,al
答案 1 :(得分:0)
这是一个显示如何创建节点的页面:Link