neo4j知识汇总

CQL

()代表一个节点,用带有方向的箭头进行标记,两个节点之间的关系用[:XXXX]来标记

CREATE创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1.创建单节点
create (n:Person {name:"如来",age:20})
// 2.创建多节点
create (n:Person {name:"孙悟空",age:20}),(m:Person {name:"猪八戒",age:30})
// 3.使用已知节点创建带属性的关系 需要先查出已知节点再创建关系
// 使用with的方法可以避免笛卡尔积警告
match(a:Person {name:"孙悟空"}),(b:Person{name:"猪八戒"})
create (b) - [:关系{relationship:"师弟"}] -> (a)
// 4.直接创建新节点再创建关系
create (a:Person{name:"沙和尚"}) - [:关系{relationship:"师弟"}] -> (b:Person{name:"小白龙"})
// 5.检索所有【关系】节点的详细信息
match(a:Person)-[:关系]-(b:Person) return a,b
// 创建全路径
create (a:Person{name:"蛟魔王"})-[:关系{relationship:"义兄"}]->(b:Person{name:"牛魔王"})<-[:关系{relationship:"义兄"}]-(c:Person{name:"鹏魔王"})

MERGE 有则返回,没有则创建

merge和create的差别在于,如果当前已经有相同的关系则直接返回,如果没有则创建,而create无论是否有该关系,都会继续创建

1
2
3
// 使用with的方法可以避免笛卡尔积警告
match (p:Person {name:"小白龙"}) with p match (a:Person{name:"孙悟空"})
merge (p) - [:关系{relationship:"师弟"}] -> (a)

MATCH查询

1
2
3
4
5
6
7
8
MATCH (n:Person) RETURN n LIMIT 25
// 查询条件
MATCH (n:person) where n.name='孙悟空' or n.name='猪八戒' RETURN n
// 正则查询
MATCH (n:person) where n.name=~'孙.*' or n.name='猪八戒' RETURN n
// 最短路径查询 最高10维度从中查找最短的路径 采用shortestpath()函数
match(a:Person {name:"孙悟空"}),(b:Person{name:"猪八戒"}),p=shortestpath((a)-[*..10]-(b)) return p
// 所有最短路径查询 采用allshortestpaths()函数 其余不变

DELETE删除(节点、关系)

1
2
3
4
// 删除节点 (前提:节点不存在关系)
MATCH (n:person{name:"白龙马"}) delete n
// 删除关系
MATCH (n:Person{name:"蛟魔王"})-[关系]->(m) delete `关系`

REMOVE删除(属性、标签)

1
2
3
4
5
// 删除属性
MATCH (n:Person{name:"蛟魔王"}) remove n.name
// 删除标签 一开始创建了2个标枪role、person后删除了person标签
CREATE (m:role:person {name:"fox666"})
match (m:role:person {name:"fox666"}) remove m:person

SET添加或更新属性值

1
match (m:role {name:"fox666"}) set m.age=20

ORDER BY排序

1
MATCH (n:Person) RETURN id(n),n.name order by id(n) desc

UNION、UNION ALL联合查询

1
2
3
4
5
6
7
8
// UNION返回不同的行(值不会重复),UNION ALL即使有相同的行也都返回(值会重复)
MATCH (n:role) RETURN n.name as name
UNION
MATCH (m:Person) RETURN m.name as name

MATCH (n:role) RETURN n.name as name
UNION ALL
MATCH (m:Person) RETURN m.name as name

LIMIT、SKIP

1
2
3
4
5
// 和mongoDB类似,可以用作分页
// 显示最前面的2行数据
MATCH (n:`西游`) RETURN n LIMIT 2
// 跳过最前面的2行数据
MATCH (n:person) RETURN n SKIP 2

NULL

1
2
3
// 当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点
// 查询Person中所有name属性值为空的对象
match (a:Person) where a.name is null return a

IN

1
match (a:Person) where a.name in ['牛魔王','孙悟空'] return a

DISTINCT

1
2
// 返回的是所有不同值
match (n:Person) return distinct(n.name)

INDEX索引

1
2
3
// 支持节点或关系属性上的索引
create index on :Person (name)
drop index on :Person (name)

UNIQUE约束

1
2
3
4
// 创建唯一约束,避免重复记录,强制执行数据完整性规则
create constraint on (n:Person) assert n.name is unique
// 删除唯一约束
drop constraint on (n:xiyou) assert n.name is unique

结合SpringBoot

  • 依赖
1
2
3
4
<dependency> 
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
  • 注解 (每个版本差别挺大,我用的2.5.4版本就没有其中一些注释)
1
2
3
4
5
6
7
@Property:实体属性 
// 以下注释2.5.4版本没有
@NodeEntity:标明是一个节点实体 替换成了@Node
@RelationshipEntity:标明是一个关系实体
@StartNode:开始节点(可以理解为父节点)
@EndNode:结束节点(可以理解为子节点)
替换成了@Relationship(direction = Relationship.Direction.INCOMING/OUTGOING)
  • @Query自定义CQL语句
1
2
3
4
5
6
@Repository
public interface RolesRepository extends Neo4jRepository<Child, Long> {
// 新增节点以及关系
@Query("create(:new {val:$from})-[:keep{name:$relation}]->(:new {val:$to})")
void createRepository(String from,String to,String relation);
}

知识图谱概念

赏个🍗吧
0%