Neo4j查询更多子查询

时间:2018-03-17 22:27:22

标签: neo4j cypher

我正在创建一个可以创建帖子的查询,并为其添加图片链接,主题标签和流派但是......

  1. 我不确定这是不是像我一样做的好方法。
  2. 每次MATCH找不到节点时,我的查询都会失败,而这种情况可能经常发生。
  3. 这是我的代码:

    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创建所有匹配合并,这取决于他们给我的类型或主题标签的数量,我需要创建更多查询。

2 个答案:

答案 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种类型匹配到单个代码段中。