WHERE
where 关键字的用法在官方文档中描述为 与match 、optional match 联合使用,作用是添加约束;如果和with联合使用,用来过滤结果。其实意思差不太多,就是对返回结果设置了限定条件。
where中可以加一些布尔运算符 入 and ,or, not ,xor。
大多数情况下where用于节点或关系的属性判断 关于属性值的相关运算种类比较多 比如 n.age>35 name<>"beijing"(不等于)或者关于字符的运算 比如正则的匹配 n.name=~'^[A-D]+.*s$' (名字以A,B,C,D其中之一开头且以s为结尾的名字) 或者利用 字符串匹配关键字 start with ,end with ,contains ,比如 n.email end with '@qq.com'这就限定了qq邮箱。这些关键字还可以和 NOT联合使用 where not n.name contains 'ing' 。这些都是容易想到的功能。还有一些比较容易忽视的使用方式(其实是我容易忽视)见下。
节点属性是否存在-exists()
match (n) where exists(n.color) return n;//返回拥有color属性的节点 节点属性存在还可以用 is not null来代替 match (n) where n.color is not null return n
路径模式过滤
where不仅能够对属性值做判断处理 还能够用路径模式过滤比如 match (n:city) where (n)-->(:city{name: "beijing"}) return n; 返回对名字为beijing的city节点有指向关系的节点。
过滤节点标签
match (n) where n:word return n ;//返回标签为word的节点 其实这个有点鸡肋啊 match (n:word) return n;不挺好么。
结束语 在匹配搜索时返回满足一些条件的节点是很容易的,返回不存在某一条件的结果往往难以实现 比如返回A的一些朋友,这些朋友的条件是这些朋友没有朋友(假设朋友这个关系不是相互的)。这时"没有朋友"比较不好描述。这时候需要用到路径模式过滤可以这样写:
match (n:kid{name:"A"})-[:FRIEND]->(m:kid) where not m-[:FRIEND]->() return m;