neo4j-cypher

时间:2025-05-02 22:07:43

cypher查询务必在需要查询的节点上加上标签,否则数据量一大查询就会非常慢(在查询时必须设置实体标签,否则不走索引),另外Neo4j索引做好了查询的优化基本上就完成了80%。需要注意index是建立在label上的,不是在node上,所以一个node有多个label,需要对每一个label都建立index。直接根据ID查询效率也比较高。

一、索引的创建分为单属性索引和复合索引:
1、创建单属性索引

CREATE INDEX ON :地(name);

2、创建复合索引

CREATE INDEX ON :账号(name,event_site_name,site_name);

3、创建唯一限制(多属性联合唯一限制社区版本目前不支持)

CREATE CONSTRAINT ON(n:地)ASSERT n.name IS UNIQUE;

二、常用查询
1、 删除节点和关系

match p=(n)-[r]-(m) where n.name=~'.*name.*' delete n,r;
match p=(n)-[r]-(m) where n.name contains 'name' delete n,r; // 模糊查询也可以使用非正则的形式(关键字)

2、.删除节点(删除时知识图谱全是独立的实体节点没有关系,如果存在关系必须先删除关系)

match(n:事 {name:'2'}) delete n;

3、删除所有节点和关系

match(n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

4、查询所有节点

match(n) return n;

5、通过name查询节点

Match (n:人) where n.姓名='李泽钜' return n

6、通过关系类型查询-过滤与青海省有隶属关系的市

MATCH (省 { NAME:'青海省' })<-[:隶属关系]-(市) RETURN 市;

7、关联节点的name

MATCH (省 { NAME:'青海省' })--(市) RETURN 市.NAME
MATCH (省 { NAME:'青海省' })-[]-(市) RETURN 市.NAME

8、带索引的查询会更快速

MATCH (n:地 { NAME:'青海省' })--(m:市) RETURN m;

9、查询关系的名称

match( p1:市 {NAME:"西宁市"} )-[rel:隶属关系]->(p2) return p2.NAME

10、距离为1到3的关联节点

match(n:国家 {NAME:'中国'})-[*1..3]-(p) return n,p;
[ ] 括号内n的意义:
n 距离为n
..n 最大距离为n
n.. 最小距离为n
m..n 距离在m到n之间

11、国家省市区县

match p=(n:国家 {NAME:'中国'})-[:隶属关系*..2]-(m) with *,relationships(p) as r return n,m;

12、多标签查询

match (n:人:演员) return n;

13、通过节点ID查询

match (user)-[:主要成就]->(p) where id(user)=71 return p;
match (n) WHERE id(n)=99815 RETURN n;

14、通过多个节点ID查询

start user=node(71,68) match (user)-[:主要成就]->(p) return p;

15、删除带有关系的节点

start grace=node(10) match grace-[r]-() delete grace,r

16、更新节点属性

start user=node(1,2) set user.group='ADMINISTRATOR'

17、删除节点属性

start n=node(1) delete n.group;

18、删除关系

start grace=node(69) match (grace)-[r:妻子]-() delete r
start grace=node(71) match (grace)-[r:妻子]->(p:人 {name:'庄月明'}) delete r

19、删除节点与关系

start grace=node(89264) match (grace)-[r]-() delete grace,r

20、match子句和create的组合,MERGE子句

MERGE (michael:Person { name: 'Michael Douglas' }) RETURN michael;

21、人员距离为N的时候寻找与之有关联的人员

match p=(n:人 {name:'WQ111'})-[*..2]-(m:人) with *,relationships(p) as r return n,m;

22、统计当前图数据库的节点数量

MATCH (n) RETURN count(n);

23、统计当前图数据库的关系数量

MATCH ()-->() RETURN count(*);

24、What kind of nodes exist. Sample some nodes, reporting on property and relationship counts per node.

MATCH (n) WHERE rand() <= 0.1
RETURN
DISTINCT labels(n),
count(*) AS SampleSize,
avg(size(keys(n))) as Avg_PropertyCount,
min(size(keys(n))) as Min_PropertyCount,
max(size(keys(n))) as Max_PropertyCount,
avg(size( (n)-[]-() ) ) as Avg_RelationshipCount,
min(size( (n)-[]-() ) ) as Min_RelationshipCount,
max(size( (n)-[]-() ) ) as Max_RelationshipCount

25、What is related, and how(Neo4j函数可以在Cypher语句的任何关键字附近使用,而过程非也)

CALL db.schema() // Neo4j过程(这些是Neo4j自带过程,非自定义过程)

26、List node labels

CALL db.labels()

27、List relationship types

CALL db.relationshipTypes()

28、Display constraints and indexes

:schema

29、查询与周迅有直接关系的明星

match m=(:明星 {名称:'周迅'})-[*..1]-() return m;

30、查询周迅与王菲的最短路径

MATCH p = shortestPath((周迅:明星 {名称:"周迅"})-[*..6]-(王菲:明星 {姓名:"王菲"}))RETURN p;

31、查询周迅与王菲的所有最短路径

MATCH p = allShortestPaths((周迅:明星 {名称:'周迅'})-[*..6]-(王菲:明星 {姓名:'王菲'})) RETURN p;
match p=allshortestpaths((n:People {name:'蔡成功'})-[*..6]-(m:People {name:'季昌明'})) return p;

32、查询股票与股东的关系

match m=(h:Holder)-->(s:Stock) where s.name=~".*五矿.*" return m;

33、给已经存在的人添加关系

Match (n:Person {id:'erzi'}),(f:Person {id:'bozi'}) Merge (n)-[:fuqi]->(f)

34、儿子和柏之结婚了,relation修改

Match (n:Person ),(f:Person)
where n.id='erzi' and f.id='bozi'
Merge (n)-[r:fuqi]->(f) delete r
Merge (n)-[:FUQI]->(f)
return n,f

35、更新属性

Match (n:Person {id:'baba'}) set n.name='张三' return n;

36、删除label

MATCH (n:Test) remove n:Test
remove和delete都应该与match命令一起使用,
DELETE操作用于删除节点和relation。
REMOVE操作用于删除标签label和属性。

37、删除与该关系相关的老师和学生及label

MATCH (s:Teacher)-[r:teach]->(d:Student) delete r,s,d

38、更新属性

Match (n:Person {id:'baba'}) set n.name='张三' return n;

39、仅仅删除一个relation

Match (a:Person),(b:Person) where a.id='erzi' and b.id='bozi' merge (a)-[r:FUQI]->(b) DELETE r

40、排序 order by

-降序 MATCH (n:Person) RETURN n order by n.id,n.name desc LIMIT 25
--正序 MATCH (n:Person) RETURN n order by n.id LIMIT 25

41、Limit 和 skip

Limit : 显示多少行,最前边开始, Skip:跳过前多少行
MATCH (n:Person) RETURN n order by n.id desc skip 2 LIMIT 25

42、Union 和 union all

Union:把多段Match的return结果 上线组合成一个结果集,会自动去掉重复行;
Union all:作用同union,但不去重;
eg. MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id='erzi' RETURN n.id,n.age

43、Null需要注意什么

eg. MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id='erzi' and n.age is not null RETURN n.id,n.age
Where 属性 is null or is not null

44、In语法

MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id in ['erzi','bozi','baba'] RETURN n.id,n.age

45、内置 id

Create (a:Person {id:’123’}) //这里的ID是一个属性,和内置ID是两码事
通过函数id(node/relation)可以获取id值

46、索引index(根据需要把查询多的字段建索引(create index on :Person(name))

相关文章