我正在创建一个可以创建帖子的查询,并为其添加图片链接,主题标签和流派但是......
这是我的代码:
MATCH (user:User)
WHERE ID(user) = 611
WITH user
MERGE (post:Post {description: 'test', type: 'sketch'}) - [p:Post {date_upload: timestamp(), visual: 0 }] ->(user)
WITH user, post
MATCH (gen:Genre)<-[:IT]-(:GenreLang {name: 'Drammatico'})
MERGE (post)-[:HAS_GENRE]->(gen)
WITH user, post
MATCH (gen:Genre)<-[:IT]-(:GenreLang {name: 'Azione'})
MERGE (post)-[:HAS_GENRE]->(gen)
WITH user, post
MATCH (post)-[:HAS_GENRE]->(g)<-[:IT]-(r)
RETURN user, post, r.name
我使用Node.js中的foreach创建所有匹配合并,这取决于他们给我的类型或主题标签的数量,我需要创建更多查询。
答案 0 :(得分:0)
首先,不要使用节点ID,只使用您创建和索引的密钥。你可以像这样创建一个索引和约束。
CREATE CONSTRAINT ON(用户:用户)ASSERT user.email_address IS UNIQUE
MATCH(用户:用户{email_address:&#34; joe@example.com"})
至于匹配。您可以使用OPTIONAL MATCH来匹配节点或关系,而无需在匹配失败时停止执行。
OPTIONAL MATCH(gen:Genre)&lt; - [:IT] - (:GenreLang {name:&#39; Drammatico&#39;})
如果未找到匹配项,则返回NULL值,但查询将继续。
答案 1 :(得分:0)
无法匹配的MATCH
将中止整个查询。
如果您不希望发生这种情况,请使用OPTIONAL MATCH
。来自OPTIONAL MATCH
的未匹配的未绑定标识符将具有NULL
值。
例如,您的查询可能如下所示(我假设第一个MATCH
需要保持原样):
MATCH (user:User)
WHERE ID(user) = 611
MERGE (post:Post {description: 'test', type: 'sketch'})-[:Post {date_upload: timestamp(), visual: 0 }]->(user)
WITH user, post
OPTIONAL MATCH (gen:Genre)<-[:IT]-(gl:GenreLang)
WHERE gl.name IN ['Drammatico', 'Azione']
CALL apoc.do.when(gen IS NOT NULL, 'MERGE (post)-[:HAS_GENRE]->(gen)', '', {post: post, gen: gen}) YIELD value
WITH user, post
MATCH (post)-[:HAS_GENRE]->()<-[:IT]-(r)
RETURN user, post, r.name;
APOC程序apoc.do.when用于确定OPTIONAL MATCH
在执行包含的MERGE
语句之前是否成功。
此外,此查询重构了原始的Cypher代码,以便将2种类型匹配到单个代码段中。