在 Neo4j Cypher 查询中创建 TempArticle 时出现问题

问题描述 投票:0回答:1

问题:

我正在开发 Neo4j Cypher 查询,旨在更新或创建商店和文章之间的关系。目标是如果现有关系的日期早于新日期,则更新现有关系;如果该关系不存在,则创建一个新的 TempArticle 节点并建立关系。但是,我编写的代码似乎没有按预期工作。

    :param { store_id: 22, article_name: "Candy shop", new_date: "2023-12-14", new_price: 32, article_description: "" };

MERGE (s:Store {store_id: $store_id, name: "STORE DEMO NAME"}); // testing store

MATCH (store:Store {store_id: $store_id})
OPTIONAL MATCH (store)-[rel:HAS_ARTICLE {article_name: $article_name}]->(article)
WITH store, rel, article,
     CASE
         WHEN rel IS NOT NULL AND rel.date < date($new_date) THEN true
         ELSE false
     END AS shouldUpdateRel,
     CASE
         WHEN rel IS NULL THEN true
         ELSE false
     END AS shouldCreateTempArticle
WITH store, rel, article, shouldUpdateRel, shouldCreateTempArticle
WHERE shouldUpdateRel
SET rel.date = date($new_date)
SET rel.prev_price = rel.price
SET rel.price = $new_price 
SET rel.article_name =  $article_name

WITH store, article, shouldCreateTempArticle
WHERE shouldCreateTempArticle
CREATE (tempArticle:TempArticle {article_name: $article_name, article_description: $article_description})
MERGE (store)-[newRel:HAS_ARTICLE]->(tempArticle)
SET newRel.date = date($new_date)
SET newRel.price = $new_price
SET newRel.article_name =  $article_name
RETURN store, article, shouldCreateTempArticle

问题:

代码预计会更新现有关系,并在必要时创建具有新关系的 TempArticle 节点。但是,我注意到,虽然关系更新部分似乎工作正常,但 TempArticle 创建部分的行为却不像预期的那样。尽管逻辑表明当 shouldCreateTempArticle 为 true 时应该创建 TempArticle,但事实并非如此。

预期结果:

当 shouldCreateTempArticle 为 true 时,应创建一个新的 TempArticle 节点以及与商店的关系。

目前的成果: 尽管设置了逻辑和条件,但 TempArticle 节点并未按预期创建。

如果您能就可能导致此问题的原因以及如何解决该问题提供任何见解或建议,我将不胜感激。预先感谢您的协助!

neo4j cypher
1个回答
0
投票

是的,你永远不会遇到 rel 为空的情况,因为如果模式没有匹配,它不会超过可选匹配。

您可以尝试使用此数据:

create (:Store {id:22,name:"STORE DEMO NAME"})-[:HAS_ARTICLE ]->(:Article {price :30,name:"Candy",date:"2023-12-13"});
:param {"data":[{"store_id": 22, "article_name": "Candy", "date": "2023-12-14", "price": 32},{"store_id": 22, "article_name": "Chocolate", "date": "2023-12-14", "price": 32},{"store_id": 22, "article_name": "Chocolate", "date": "2023-12-12", "price": 25}]}

然后运行这个

unwind $data as art
match (store:Store {id: art.store_id})
merge (store)-[rel:HAS_ARTICLE]->(article:Article {name:art.article_name})
on create set article.date=art.date,article.price=art.price
with art,article where article.date<art.date
set article.date=art.date,article.price=art.price

一切都在

merge
中,创建了模式中不存在的部分。弄清楚有点棘手,我发现这个视频有助于理解它是如何工作的https://www.youtube.com/watch?v=w42uqxGd7qM&t=12s

我没有在关系上注明日期,因为我不明白为什么除了文章上的日期之外你还需要它

第一行数据更新“糖果”,第二行创建“巧克力”,第三行被忽略,因为日期早于创建巧克力的日期

© www.soinside.com 2019 - 2024. All rights reserved.