【问题标题】:Neo4j query with more subqueries具有更多子查询的 Neo4j 查询
【发布时间】:2018-03-19 03:26:45
【问题描述】:

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

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

这是我的代码:

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

【问题讨论】:

  • 忘记 ID(user) 节点 ID 不适合我们开发用户。仅仅是因为 id 可能会被重新归因。使用您掌握的标识符,而不是节点 ID。

标签: neo4j cypher


【解决方案1】:

匹配失败的MATCH 将中止整个查询。

如果您不希望这种情况发生,请使用OPTIONAL MATCHOPTIONAL 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 用于在执行包含的MERGE 语句之前确定OPTIONAL MATCH 是否成功。

此外,此查询重构了原始 Cypher 代码,以便将这两种类型匹配到一个代码段中。

【讨论】:

    【解决方案2】:

    首先,不要使用节点 ID,只使用您创建和索引的键。您可以像这样创建索引和约束。

    CREATE CONSTRAINT ON (user:User) ASSERT user.email_address 是唯一的

    匹配(用户:用户{email_address:“joe@example.com”})

    至于匹配。您可以使用 OPTIONAL MATCH 来匹配节点或关系,而不会在匹配失败时停止执行。

    可选匹配(gen:Genre)

    如果未找到匹配项,这将返回 NULL 值,但查询将继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2012-05-12
      • 2017-10-22
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多