一、基本概念
Cypher是一个图形查询语言,用于在Neo4j图形数据库中进行查询。它的语法格式类似于SQL,但是它的查询对象是节点和关系。一个Cypher查询由多个子句构成,每个子句都以关键字开头。
在Cypher中,节点由圆括号表示,关系用中括号表示,节点和关系都可以具有属性。
// 查询id为1的节点及其所有关系和属性 MATCH(n {id:1}) RETURN n
二、MATCH子句
MATCH子句用于从图形数据库中检索数据。在MATCH后面,可以指定要检索的节点和关系的模式,以及它们的属性和标签。
可以在一个MATCH子句中指定多个模式,它们之间互相连接,形成一个完整的模式链。
// 查询通过产品类型为“手机”连接的所有订单 MATCH (p:Product {type:'手机'})<-[:CONTAINS]-(o:Order) RETURN o
三、WHERE子句
WHERE子句用于过滤MATCH子句返回的结果。在WHERE子句中可以指定多个过滤条件,它们之间用AND或OR连接。
// 查询出品时间在2020年之前的所有产品 MATCH (p:Product) WHERE p.produce_date.year<2020 RETURN p
四、RETURN子句
RETURN子句用于返回查询结果。可以在RETURN后面指定要返回的节点或关系的属性、标签、或者一些计算结果。
// 查询所有年龄大于30岁的用户的邮箱地址 MATCH (u:User) WHERE u.age>30 RETURN u.email
五、CREATE子句
CREATE子句用于创建节点或关系。可以在CREATE子句中指定节点或关系的标签、属性和连接方式。
// 创建一个名为“张三”的用户节点 CREATE (u:User {name:'张三'})
六、MERGE子句
MERGE子句用于创建或者更新节点或关系。如果数据库中不存在与MERGE指定的模式相匹配的节点或关系,则创建它们;如果存在,则更新它们的属性。
// 如果不存在id为1的节点,则创建它;否则更新它的name属性 MERGE (n {id:1}) SET n.name='张三'
七、DELETE子句
DELETE子句用于删除节点或关系,如果在删除节点的同时会删除与之相关的所有关系。
// 删除id为1的节点及与之相关的所有关系 MATCH (n {id:1}) DETACH DELETE n
八、ORDER BY子句
ORDER BY子句用于按照指定的属性或者表达式对查询结果进行排序。可以指定升序或降序。
// 查询价格最高的前10个产品 MATCH (p:Product) RETURN p ORDER BY p.price DESC LIMIT 10
九、UNION子句
UNION子句用于对两个或多个查询结果进行合并。要求每个查询结果的列数和列名必须相同。
// 查询产品类型为“手机”或“电脑”的所有订单 MATCH (p1:Product {type:'手机'})<-[:CONTAINS]-(o1:Order) RETURN o1 UNION MATCH (p2:Product {type:'电脑'})<-[:CONTAINS]-(o2:Order) RETURN o2
十、WITH子句
WITH子句用于在查询中创建中间结果。可以在WITH后面指定要返回的列和一些计算结果,然后将中间结果传递给下一个子句。
// 按照用户的购买金额排名查询前10名用户 MATCH (u:User)(p:Product) WITH u, SUM(p.price) AS totalPrice RETURN u ORDER BY totalPrice DESC LIMIT 10
十一、CALL子句
CALL子句用于调用Neo4j内置的一些过程或者Java方法。可以在CALL后面指定要调用的函数和参数。
// 执行Jaccard相似度算法 MATCH (p1:Product)-[:CONTAINS]->()<-[:CONTAINS]-(p2:Product) WITH p1, p2, COUNT(*) AS intersection CALL algo.similarity.jaccard.stream(p1, p2, {write:true, topK:10, similarityCutoff:0.01}) YIELD item1, item2, similarity RETURN item1.name, item2.name, intersection, similarity
十二、FOREACH子句
FOREACH子句用于循环遍历一个给定的列表,对其中的每个元素都执行一系列操作。
// 对订单中的所有产品计算总价,并添加“total_price”属性到订单中 MATCH (o:Order)-[:CONTAINS]->(p:Product) WITH o, SUM(p.price) AS totalPrice FOREACH(ignoreMe IN CASE WHEN o.total_price IS NOT NULL THEN [1] ELSE [] END | SET o.total_price = totalPrice)
原创文章,作者:KGAIC,如若转载,请注明出处:https://www.506064.com/n/332800.html