neo4j - Cypher - 条件 where 子句
问题描述
我正在尝试按 id 或名称更新用户主题名称。目前我的查询是这样的:
MATCH (s:Subject)-[:REGISTERED-BY]->(u:User{id: 1})
WHERE s.name="Math" or s.id=""
SET s.name = "Maths"
RETURN s
如果我只使用没有 的名称OR
,它可以工作。如果我只使用 ID 并将名称保留为空字符串,它就可以工作。但是,如果我在 OR 子句中使用名称并将 id 留空。更新不会发生我需要有条件地更新名称,具体取决于名称是否可用或 id。id 字段是一个 UUID。有没有办法在查询本身中编写该逻辑?
解决方案
这可能会对您有所帮助,在 Neo4j 中,您可以使用两个选项执行条件操作。
如果您有权访问 APOC,则可以使用APOC.do.when
:
MATCH (s:Subject)-[:REGISTERED-BY]->(u:User{id: 1})
WHERE ...
CALL apoc.do.when(s.name="Math", "SET s.name = \"Maths\"", "", {}) YIELD value as _
RETURN s
第二个是更原生的FOREACH
:
MATCH (s:Subject)-[:REGISTERED-BY]->(u:User{id: 1})
WHERE ...
FOREACH(_ IN CASE s.name WHEN "Math" THEN [1] ELSE [] END | SET s.name = "Maths" )
RETURN s
推荐阅读
- javascript - 如何支持带有隐藏文本的“在页面上查找”
- python - 是否可以从 Django 中的 Q 返回单个值?
- c++ - 调用 ICorRuntimeHost::UnloadDomain 方法永远不会返回
- c++ - 如何检查模板参数是否属于特定模板类型(多个类型参数)
- javascript - FizzBuzz:num%15 是第一名,而 num%3 是第一名
- python - 如何记录出现在 Python 中的多个函数中的参数?
- apache-spark - 关于在pyspark中使用cast函数处理时间信息
- r - 运行 Rserve R
- c# - 需要读取 CSV 文件并识别空行
- c++ - 如何阻止 ostringstream (oss) 添加/覆盖预定义变量?