Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Cypher Neo4J的IF...ELSE

使用Cypher Neo4J的IF...ELSE
EN

Stack Overflow用户
提问于 2017-04-18 20:19:06
回答 2查看 11.8K关注 0票数 7

Cypher中的IF/ELSE语句的语法是否有任何更新?

我知道CASEFOREACH的“黑客”,但它们读起来太难看了:)

我想用可选参数做一些事情,比如:

代码语言:javascript
运行
AI代码解释
复制
CASE WHEN exists($refs.client) THEN MATCH (cl:client {uuid: $refs.client}) END
...

// and later use it like
CASE WHEN exists(cl) THEN DELETE tcr MERGE (t)-[:references]->(cl) END

// and again in my return
RETURN {
  client: CASE WHEN exists(cl) THEN {uuid: cl.uuid} ELSE NULL END,
}

我知道这在上下文中没有多大意义,但我基本上传入了一个refs对象,该对象可能包含参数,也可能不包含参数(或者参数存在且为空)

在我读到的某个地方,可能有一个关于如何在neo4j中处理" if /else“的更新,所以我真的只想查看一下,看看是否有人意识到有一个”更好“的方法来处理这样的情况。

目前,我只是在代码中处理所有的查询,并运行一些较小的查询,但它需要重复查找来创建和删除引用。我想把它全部移到一个更大的查询中,这样我就可以使用变量引用了。

再说一次,我知道我可以使用FOREACH...CASE,但是当有很多像这样的小案例时,它会变得很麻烦。

目前的错误是

代码语言:javascript
运行
AI代码解释
复制
{ Error: Invalid input 'S': expected 'l/L' (line 7, column 9 (offset: 246))
"      CASE true WHEN exists($refs.client) THEN MATCH (cl:client {uuid: $refs.client}) END"
         ^

我还知道,如果我正在回传一个已知值,但不能在其中执行MATCH,则可以使用WITH...CASE

想要在查询顶部的CASE中执行MATCH的原因之一是,如果refs上的属性存在,但MATCH不成功,则查询将失败。使用OPTIONAL MATCH不能做到这一点。

编辑哦还有..。我正在检查使用MATCH (cl:client {uuid: $refs.client}) WHERE exists($refs.client),但我记得它不能正常工作。

编辑:我可以做MATCH...WHERE exists(),但是如果我不能做MERGE WHERE exists(),那就是徒劳的

编辑以供参考,以显示我为什么要询问IF/ELSE,这是我正在查看的查询。我已经从上面的例子中修改了它,这样它就不会出错。

代码语言:javascript
运行
AI代码解释
复制
MATCH (u:user {uuid: $uid})-[:allowed_to {read: true}]->(c:company {uuid: $cid})
MATCH (t:timesheet {uuid: $tid})<-[:owns]-(:timesheets)<-[:owns]-(u)

// Make sure the incoming references are valid or fail query
// Here, I'd like only do a match IF $refs.client exists and IS NOT NULL. If it is null or does not exist, I don't want the query to fail. OPTIONAL MATCH will not fail if the value is passed in is invalid but will simply return NULL. Which is why IF/ELSE (or CASE) would be helpful here.
MATCH (cl:client {uuid: $refs.client})
MATCH (ca:case {uuid: $refs.case})
MATCH (s:step {uuid: $refs.step})
MATCH (n:note {uuid: $refs.note})

// clone timesheet entry to a revision
CREATE (t)-[:assembled_with]->(r:revision)
SET r = t, r.created_at = $data.updated_at

WITH *

// Get the old references
MATCH (t)-[tcr:references]->(rc:client)
MATCH (t)-[tcar:references]->(rca:case)
MATCH (t)-[tsr:references]->(rs:step)
MATCH (t)-[tnr:references]->(rn:note)

// Copy old references to revision (won't create new relationships with NULL)
MERGE (r)-[:references]->(rc)
MERGE (r)-[:references]->(rca)
MERGE (r)-[:references]->(rs)
MERGE (r)-[:references]->(rn)

// Update the current timesheet with new data
SET t += $data

// If new references are incoming, delete the old ones and update for new ones
DELETE tcr
DELETE tcar
DELETE tsr
DELETE tnr
MERGE (t)-[:references]->(cl)
MERGE (t)-[:references]->(ca)
MERGE (t)-[:references]->(s)
MERGE (t)-[:references]->(n)

WITH *

// Get the new count of revisions
MATCH (t)-[:assembled_with]->(_r:revision)

RETURN {
  uuid: t.uuid,
  start: t.start,
  end: t.end,
  description: t.description,
  client: CASE WHEN exists(cl.uuid) THEN {uuid: cl.uuid} ELSE NULL END,
  case: CASE WHEN exists(ca.uuid) THEN {uuid: ca.uuid} ELSE NULL END,
  step: CASE WHEN exists(s.uuid) THEN {uuid: s.uuid} ELSE NULL END,
  note: CASE WHEN exists(n.uuid) THEN {uuid: n.uuid} ELSE NULL END,
  revisions: count(_r)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-15 22:11:57

APOC Procedures刚刚更新了对conditional cypher execution的支持。您需要3.1.3.7或更高版本(如果使用Neo4j 3.1.x),或者3.2.0.3或更高版本(如果使用Neo4j 3.2.x)。

以下是您提到的一些案例的示例,使用了新的过程:

代码语言:javascript
运行
AI代码解释
复制
CALL apoc.when($refs.client IS NOT NULL, 
 "MATCH (cl:client {uuid: refs.client}) RETURN cl", '', {refs:$refs}) YIELD value
WITH value.cl as cl  // which might be null...
...

...
CALL apoc.do.when(cl IS NOT NULL, 
 "DELETE tcr 
  MERGE (t)-[:references]->(cl)", '', {tcr:tcr, t:t, cl:cl}) YIELD value
...

...
RETURN {
  client: cl {.uuid}, ...
}

在您的返回中,地图投影足以满足您的需求,如果cl存在,您将获得一个具有uuid的对象,如果不存在,则client将为null。

票数 10
EN

Stack Overflow用户

发布于 2021-01-28 07:27:37

老问题,但有一些新技巧来实现条件循环执行,特别是在Neo4j 4.1.x中引入的子查询。

这篇知识库文章涵盖了可用的选项,我们将在其他方法可用时随时更新这篇文章。

https://neo4j.com/developer/kb/conditional-cypher-execution/

请注意,我的旧答案中的APOC方法仍然有效,并包含在本文中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43481472

复制
相关文章
Android震动器Vibrator调用
<uses-permission android:name="android.permission.VIBRATE"/>
程序员飞飞
2020/02/27
3.8K0
python 调用Google Tran
调用Google 翻译API进行翻译 #!/usr/bin/python #coding: UTF-8 import sys reload(sys) sys.setdefaultencoding('utf8') from xml.etree import ElementTree as ET #引入解析xml文件的模块 import re import urllib,urllib2 #引入接入网络接口API的模块 from socket import error as SocketE
py3study
2020/01/09
1.1K0
【设备】震动(Vibration)
概述 设备方向(Orientation) API 是通过vibrate()方法来实现的,通过该方法, 当有事件通知时,WEB应用程序可以让设备震动以达到提醒用户的目的。
Html5知典
2019/11/26
9400
安卓调用铃声、震动及设置Toast不重复弹出
直接上代码啦,调用铃声 MediaPlayer mp=new MediaPlayer(); try { mp.setDataSource(this, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); mp.prepare(); mp.start(); } catch (IOException e) {
用户4458175
2020/02/12
8120
jquery调用页面的方法
本文转载:http://www.cnblogs.com/chenxizhang/archive/2009/05/28/1491250.html
跟着阿笨一起玩NET
2018/09/19
3.2K0
Memos API 调用渲染页面
*更新:已把 Memos 剥离出一个完整的应用,可独立部署,到 eallion/memos.top 这个仓库下载部署到网站根目录即可。 *HUGO:如果使用的是 Hugo 博客框架,可以参考本站的方法:layouts/_default/memos.html
eallion
2023/03/07
3.4K0
Python3调用Google翻译
想弄一个批量翻译的东西,奈何百度翻译别人根本不研究,所以只能看谷歌翻译的了;这份代码的作者写的太聪明了,是真的很棒,思路很好,看到这样的代码简直年轻10岁
Elapse
2020/08/17
1.5K1
Typecho自定义调用如热门文章随机文章等
这是面向模板开发者的一篇干货文章,通过学习下面的两个事例,你可以通过调整数据库语句来实现自定义调用文章,如随机文章等。
泽泽社长
2023/04/17
6550
使用 Google Analytics 统计页面加载时间
Google 已经把页面加载速度纳入了页面排名影响因素,所以现在建立一个对搜索引擎友好的站点,除了要进行 SEO (页面优化和获取外链即)之外,还要考虑选择一个运行稳定而且速度不错的主机,以及网站程序的优化。
Denis
2023/04/14
1.7K0
使用 Google Analytics 统计页面加载时间
OpenHarmony/HarmonyOS震动模块的使用
@ohos.vibrator (振动) 作者:坚果,公众号:”大前端之旅“,哔哩哔哩,OpenHarmony布道师,OpenHarmony校源行开源大使,51CTO博客专家博主,阿里云博客专家。 导入模块 使用的时候,需要先导入对应的模块 import vibrator from '@ohos.vibrator'; 添加权限 然后需要添加权限 FA "reqPermissions": [ { "name": "ohos.permission.VIBRATE" } Stage "reque
徐建国
2023/02/23
6660
OpenHarmony/HarmonyOS震动模块的使用
小程序跨页面函数调用
此处注意一点:在export函数后面不要加逗号!虽然是在小程序里面,但是这是js文件,且不在page和component函数里面。
肥晨
2023/02/16
5K0
17-跨语言调用 Google ProtoBuf
定义其他复杂类型参考:https://blog.csdn.net/lijingjingchn/article/details/89466437
彼岸舞
2022/02/18
6160
17-跨语言调用 Google ProtoBuf
如何在Fortran中调用Python
Python是机器学习领域不断增长的通用语言。拥有一些非常棒的工具包,比如scikit-learn,tensorflow和pytorch。气候模式通常是使用Fortran实现的。那么我们应该将基于Python的机器学习迁移到Fortran模型中吗?数据科学领域可能会利用HTTP API(比如Flask)封装机器学习方法,但是HTTP在紧密耦合的系统(比如气候模式)中效率太低。因此,可以选择直接从Fortran中调用Python,直接通过RAM传递气候模式的状态,而不是通过高延迟的通信层,比如HTTP。
bugsuse
2020/04/21
6.2K0
如何在Google搜索到我的网站?
我需要解析的域名为 taixingyiji.com,我的域名解析商是CloudFlare
taixingyiji
2022/07/25
2.4K0
如何在Google搜索到我的网站?
37个常用Halo Java轻量博客页面模板标签调用(快速调用页面数据)
这篇文章应该算是Halo Java轻量博客程序的最后一篇主题开发的最后篇文章。在前面老蒋有整理到Halo页面调用、公共模板、全局变量的调用。这里我们是不是有需要页面模板标签的调用,比如最新文章、菜单、图片组的调用,这篇文章是比较全的37个Halo页面模板标签调用整理。
老蒋
2021/12/22
7800
最新C#调用Google即时翻译
主要是调用谷歌的翻译API进行翻译,WebRequest的请求,将获取到的翻译提取出来。下面上代码
kiki.
2022/09/29
7910
最新C#调用Google即时翻译
appinventor开发震动按摩APP
如图界面上,需要两个提示标签,两个按钮,两个滚动条;多媒体上需要一个音效播放器,一个计时器,一个对话框;布局上需要用到水平布局和垂直布局,具体怎么用简洁美观即可。 为两个标签分别设置“震动间隔”和“震动时长”内容,红色字体,滚动条分别设置最大值和最小值,单位是毫秒。
泽泽社长
2023/04/17
7410
appinventor开发震动按摩APP
如何在Google Web Toolkit环境下Getshell
Google Web Toolkit简称(GWT),是一款开源Java软件开发框架。今天这篇文章会介绍如何在这样的环境中通过注入表达式语句从而导致的高危漏洞。
Ms08067安全实验室
2020/02/21
7930
WordPress网站底部的自定页面(如:网站地图等)按钮美化教程
最近浏览博客,看到不少朋友这个底部的美化,我也觉得底部的这些按钮平平无奇,就想着用css设置一个样式,从而美化按钮方法,至此分享给大家。
文曦
2022/06/09
1.1K0
WordPress网站底部的自定页面(如:网站地图等)按钮美化教程
点击加载更多

相似问题

如何在调用方法后重定向google页面

23

翻动页面动画,如Google图书

13

Nifi减法后的震动转换

11

在长时间点击后震动

11

在android手机震动后停止服务?

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档