图数据科学:Cypher语法集
关键词:Cypher语法;图数据科学;neo4j
摘要:
前文自顶向下构建中药知识图谱初探和趁热打铁,再构建百万节点关系中药方剂知识图谱中,介绍了中药和方剂知识图谱的构建工作。本文将基于neo4j图数据库学习Cypher语法,为熟练使用neo4j及后续应用开发做铺垫。
1、Cypher
Cypher是一种简单高效的图查询语言,能够对图进行高效的查询、更新和管理。详细内容可了解:
https://neo4j.com/docs/cypher-manual/current/introduction/
如果了解SQL,可以很容易的上手Cypher,熟练应用neo4j。
2、基础知识
本节将对Cypher数据类型和基本语法进行介绍。
2.1 数据类型
Cypher有基本的数值类型Integer、 Float、 String、 Boolean、Point, Date、Time、LocalTime、DateTime、LocalDateTime、Duration和复合类型List 、Map。
Cypher是图数据库,图由节点和边(关系)组成。此处,将介绍Node、Relationship和Path三种结构类型。
(1)节点Node
Node包括id(节点id)、labels(一类节点的标签)和properties(map形式,存储节点信息),如一个labels为“中药名”的节点“地骨皮”存在neo4j中时图和表格的具体形式如图1所示。
图1 节点信息展示
(2)关系Relationship
Relationship包括Id(关系id)、Type(头节点和尾节点之间的关系类型)、properties、Id of the start node(头节点id)和Id of the end node(尾节点id)。
一个关系表示如下:
{
"identity": 1,
"start": 4775,
"end": 4774,
"type": "from",
"properties": {
}
}
(3)链路Path
节点与关联关系组成的序列。
2.2 基础语法---增删改查
(1)创建节点
在Cypher中( )表示一个节点,因此添加一个节点需要在()中添加节点labels和properties,比如:
创建一个label为“方名”,properties中包含name:“火郁汤”的节点语法为:
CREATE (labels:`方名` {name: "火郁汤"})
创建一个labels为“来源”,properties中包含name:“《回春》”的节点语法:
CREATE (labels:`来源` {name: "《回春》"})
(2)创建关系
在Cypher中[ ]表示关系,–>[ ]表示有向关系。
为已有节点“火郁汤”和“《回春》”节点创建有向关系“from”的两种方法:
方法1:CREATE关键词
MATCH (n1:`方名`), (n2:`来源`)
WHERE n1.name = "火郁汤" and n2.name = "《回春》"
CREATE (n1) - [r:`from`] -> (n2)
RETURN r
方法2:MERGE关键词
MATCH (n1:`方名` {name: "火郁汤"}), (n2:`来源` {name: "《回春》"}) MERGE (n1) - [r:`from`] -> (n2)
同时创建节点和关系示例:
CREATE (n1:`中药名` {name: "地骨皮"}) - [r:`dose`] -> (n2:`剂量` {name: "1钱"})
RETURN r
(3)创建链路
示例语法如下
CREATE p = (n1:`处方` {name: "处方_1"}) - [r1:`composition`] -> (n2:`中药名` {name: "甘草"}) - [r2:`dose`] -> (n3:`剂量` {name: "3分"})
RETURN p
至此,创建的节点、关系和链路如图2所示:
图2
最终利用前面语法补全几个关系后的图谱如图3所示:
图3
一个可能的语法错误:
Neo.ClientError.Statement.SyntaxError:可能是节点labels和关系type的引号用错了,正确引号是反单引号 `
(4)删除
删除标签和属性用关键词:REMOVE
删除属性
MATCH (n:`来源` {name: "《回春》"}) REMOVE n.name return n
删除标签
MATCH (n:`来源`) REMOVE n:`来源` RETURN n
删除节点和关系用关键词:DELETE
删除单个关系:先查询,然后再删除
MATCH (n:`中药名` {name: "地骨皮"}) - [r:dose]-> (n2:`剂量` {name: "1钱"}) DELETE r
删除单个节点:先查询,然后再删除
MATCH (n:`中药名` {name: "地骨皮"}) DELETE n
删除链路
MATCH p = (n1:`处方` {name: "处方_1"}) - [r1:`composition`] -> (n2:`中药名` {name: "甘草"}) - [r2:`dose`] -> (n3:`剂量` {name: "3分"})
DELETE p
注意:如果节点存在关系,需要先删除关系再删除节点
删除全部数据的关键词:DETACH DELETE
删除一个节点和所关联的关系
MATCH (n:`方名` {name: "火郁汤"}) DETACH DELETE n
删除所有节点和关系:清库
MATCH (n) DETACH DELETE n
(5)修改
查询节点后可以用SET关键词设置属性和标签
(6)查询
MATCH关键词
查询所有节点标签
CALL db.labels()
查询所有关系类型
CALL db.relationshipTypes()
条件查询:WHERE关键词
MATCH (n:`方名`) WHERE n.name = "火郁汤" RETURN n
多层级关系查询(多跳查询)
match (n:`处方`)-[r:composition]->(n2:`中药名`)
where n2.name="甘草" or n2.name="地骨皮"
with n, r, n2
match (n2:`中药名`)-[r2:dose]->(n3:`剂量`)
return n, r, n2, r2, n3
示例结果如下:
图4
一个复杂的示例可以参考文章:趁热打铁,再构建百万节点关系中药方剂知识图谱中的图7可视化结果。
3、总结
本文通过示例对Cypher语法进行了介绍。这有助于neo4j的熟练使用。
主要参考文献
[1] https://neo4j.com/
[2] https://neo4j.com/docs/graph-data-science/current/
[3] neo4j中文手册:https://blog.csdn.net/qq_31034569/article/details/121323560
[4] https://www.cnblogs.com/luoyunfei99/articles/16048867.html
[5] https://blog.csdn.net/weixin_40739969/article/details/101781409
[6] https://www.cnblogs.com/sea520/p/11940400.html
[7] https://blog.csdn.net/mryang125/article/details/108387528
欢迎关注与留言
发表评论