为什么Cypher WHERE不起作用?

【翻译自:https://neo4j.com/developer/kb/why-where-clause-does-not-filter/

【由Neo4j APAC授权编译发布】

当我们在写Neo4j Cyper查询语句时,偶尔会发现 WHERE 子句似乎不起作用时,可能会感到非常沮丧,您可以使用下面这些方法找出问题所在。

1、检查OPTIONAL MATCH之后的WHERE子句

WHERE 子句不能单独使用,它们始终与MATCH、WITH或OPTIONAL MATCH配对,并且此配对定义了 WHERE 子句执行为 false 时的行为。

对于 WITH …​ WHERE 和 MATCH …​ WHERE,我们期望 WHERE 子句应用于所有结果行,而当 WHERE 的值为 false 时则过滤行。

但是,OPTIONAL MATCH …​ WHERE其行为有所不同,因为OPTIONAL MATCH不会删除行。使用OPTIONAL MATCH时,如果给定的模式不匹配,或者其WHERE子句的值为false,则模式中新引入的变量对于给定的行将为null。从不删除行,并且现有变量保持不变,当真正的问题是将WHERE子句应用于错误的事务时,我们会觉得 WHERE 子句根本不起作用。

MATCH (m:Movie)
OPTIONAL MATCH (m)<-[:WORKED_ON]-(a:Animator)
WHERE m.releaseYear > 1999 AND a IS NOT NULL
RETURN m, collect(a) as animators

在上面的示例中,这看起来像是一个查询,以获取1999年之后发行的电影以及该电影的动画师,其中动画师为电影工作,但这是不正确的。WHERE子句只会影响OPTIONAL MATCH,因此将返回所有电影,没有电影被过滤掉,但是动画师集合将仅填充1999年之后发行的电影。

要解决这个问题,我们需要将WHERE移动到其他位置,以便将其与MATCH或WITH关联,以便根据需要过滤掉行:

MATCH (m:Movie)
OPTIONAL MATCH (m)<-[:WORKED_ON]-(a:Animator)
WITH m, a
WHERE m.releaseYear > 1999 AND a IS NOT NULL
RETURN m, collect(a) as animators
2、WHERE子句中检查拼写错误或大小写不匹配

WHERE子句中错字和拼写错误很容易抛出,包括不匹配。

节点标签、关系类型、变量以及属性键和值都区分大小写,因此请确保前后一致并正确无误。

MATCH (m:Movie)
WHERE NOT (m)<-[:worked_on]-(a:animator) AND m.ReleaseYear > 1999
RETURN m

上面的查询没有任何拼写错误,但是关系类型、节点标签和属性键的大小写与图中的实际情况有所不同。

3、检查应为数值的属性是否存为字符串

在数值比较或匹配失败的情况下,要确保比较的属性是否为数值。

在文本结果视图中,字符串值将用引号引起来,而数值将没有。

在导入过程中,尤其是在CSV导入过程中,请特别注意,因为所有值都被解释为字符串。您需要使用 toInteger() 或 toFloat() 将字符串转换为数值,以避免出现此问题。

4、检查属性键和值中是否存在空格

属性存在空格会使 WHERE 子句看起来不起作用,通常是图数据而不是查询本身的问题。

MATCH (m:Movie)<-[:ACTED_IN]-(p:Person)
WHERE p.name = 'Keanu Reeves'
RETURN m

上面的查询看起来不错,并且可能是完全正确的。但是,如果节点的 name 属性存在空格“ Keanu Reeves”,则该查询将不起作用。

仔细检查节点和关系上的预期字符串值以查看是否存在意外的空格,如果使用Neo4j 浏览器,则文本结果视图通常是轻松检测多余空格的最佳方法。使用STARTS WITH、ENDS WITH或CONTAINS进行查询,可以帮助测试属性值。

属性键中多余的空格很少,但是偶尔会发生,例如从格式错误的文件导入数据时。

例如,如果我们尝试导入具有以下标头的csv文件:

“nickName, firstName,lastName ”

firstName前有空格,lastName后面有空格。导入后,属性键本身将包含空格,因此实际的属性键将变为“nickName”、“ firstName”和“lastName ”,如果没有被发现,可能很快会引起混乱。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容