本文对一些我平时常用的较方便的查询语句进行了总结,要想全面的学习Cypher查询语言入门,可以参考文章:https://www.cnblogs.com/ljhdo/p/5516793.html
1 Cypher查询语言简介
Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,不必编写图形结构的遍历代码实现对图形存储有表现力和效率的查询。由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。
Cypher设计的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员。它的构念是基于英语单词和灵巧的图解。Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。
Cypher查询语言重点包含以下几个部分:
- START:图中的开始点,通过元素的ID或索引查找获得。
- MATCH:图形的匹配模式,束缚于开始点。
- WHERE:过滤条件。
- RETURN:返回所需要的。
2 一些常用语句
2.1 批量创建导入节点
# 从csv文件中批量导入节点
LOAD CSV WITH HEADERS FROM 'file:///MCTao.csv' AS line FIELDTERMINATOR ','
CREATE (:AlignmentObject { name:line.name,ranker:line.ranker2,level:line.level,url:line.url,description:line.description})
若结点名称等属性为中文,一定要注意编码格式为“UTF-8",否则会出现乱码。
2.2 查看节点
# 查看特定节点
Match (n) where n.ranker='MCTao1' return n
# 查询ranker中包含'MCTao'的节点
Match (n) where n.ranker Contains 'MCTao' return n
2.3 批量删除节点
Match (n) where n.ranker Contains 'MCTao' delete n
2.4 批量创建导入节点间关系
LOAD CSV WITH HEADERS FROM "file:///MCTao.csv" AS line with line
merge (p1:KnowledgeBlock{ranker:line.ranker1})
merge (p2:AlignmentObject{ranker:line.ranker2})
WITH * create (p1)-[r:hasPartOf]->(p2)
2.5 查询节点间关系
MATCH ()-[r]-(n) where n.ranker Contains 'CTao' RETURN n,r
2.6 批量删除节点间关系
MATCH ()-[r]-(n) where n.ranker Contains 'CXkb' DELETE n,r
2.7 查找节点属性
# 查找对应的四级节点与三级节点的ranker
match (m)-[]-(n) where n.ranker Contains 'CTao' return m.ranker,n
下载csv文件作为备份保存:
2.8 从MySQL数据库导入数据至Neo4j
具体可参考我的另一篇博客:https://blog.csdn.net/strivequeen/article/details/110400741
2.9 为结点批量添加属性
CALL apoc.load.jdbc(
'jdbc:mysql://ip:3306/knowledgePoint?user=root&password=000&useUnicode=true&characterEncoding=utf8',
'select * from 通信原理_kp'
) YIELD row
MATCH (n) where n.ranker=row.ranker2 SET n.videos_url=row.video_explanation
2.10 单独更改某结点的属性
MATCH (n) where n.ranker='CTku1' SET n.description='description'
MATCH (n) where n.ranker='CPAao2271' SET n.description_baidu='随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。' n.name='ram'
2.11 补充导入关系(边)
CALL apoc.load.jdbc(
'jdbc:mysql://ip:3306/knowledgePoint?user=root&password=000&useUnicode=true&characterEncoding=utf8',
'select * from 通信原理_align'
) YIELD row
merge (p1:KnowledgeBlock{ranker:row.ranker1})
merge (p2:AlignmentObject{ranker:row.ranker2})
WITH * merge (p1)-[r:hasPartOf]->(p2)
# merge可以看成是match和create的合体
2.12 查找特定结点与连接关系三元组
MATCH p=()-[r:hasPartOf]->(n) where n.ranker="CTao143" RETURN p
2.13 模糊匹配
Neo4j 不区分大小写的模糊查询匹配
在正则表达式的前面加上(?i) : =~"(?i)regexp"
# 模糊知识点的大小写匹配,全转化成小写
MATCH (n) where lower(n.name)=lower(row.knowledgePoint) SET n.alias=row.Alias
2.14 删除多余的关系
# 查看边数量
MATCH p=()-[r:hasPartOf]->(n) where n.ranker contains "CTao" RETURN count(p)
# 删除多余的边
MATCH (a)-[r:hasPartOf]->(b)
WITH a, b, TAIL (COLLECT (r)) as rr
WHERE size(rr)>0
FOREACH (r IN rr | DELETE r)
2.15 导入边属性
CALL apoc.load.jdbc(
'jdbc:mysql://ip:3306/knowledgePoint?user=root&password=000&useUnicode=true&characterEncoding=utf8',
'select * from 通信原理_rel'
) YIELD row
merge (p1:KnowledgeBlock{ranker:row.ranker1})
merge (p2:AlignmentObject{ranker:row.ranker2})
WITH * merge (p1)-[r:hasPartOf{word_freq:row.word_frequency}]->(p2)
# merge可以看成是match和create的合体
# 查看已导入边属性
MATCH p=()-[r:hasPartOf]->(n) where exists(r.word_freq) return p
3 Neo4j的数据备份与还原方法(neo4j-admin方式)
- 切到安装目录的bin下;
- 保证neo4j为停止状态;
./neo4j stop
- 执行数据导出命令
./neo4j-admin dump --database=graph.db --to=/mnt/data/kg/Neo4j手动备份/20210816.dump
- 还原时也在bin目录下;
- 数据导入命令
./neo4j-admin load --from=/mnt/data/kg/Neo4j手动备份/20210705.dump --database=graph1.db --force
4 一些报错与解决
(1)
原因:MySQL所在服务器地址搞错了,没有改成修改之后的地址。
(2)
原因:要导入的数据中存在NULL的数据。