下载
下载链接
注意: neo4j版本超过4的,需要jdk11来支持,一般我们开发环境都是jdk1.8,所以我们只需选择3版本最高的即可。
启动关闭命令
#1. 控制台启动
./neo4j.bat console
#2. 作为守护进程
#启动
./neo4j.bat start
#关闭
./neo4j.bat stop
#3. 浏览器输入地址http://localhost:7474,输入初始用户密码neo4j,按照步骤修改初始密码
cql语句
- create 创建节点、关系和属性
- match 检索有关节点、关系和属性数据
- return 返回查询结果
- where 提供条件过滤检索数据
- delete 删除节点和关系
- remove 删除节点和关系的属性
- order by 排序检索数据
- set 添加或更新标签
新增
#1. 导入excel,注意:excel必须是csv,并且编码必须是UTF-8,excel放到安装目录neo4j-community-3.5.30\import下
# 命令格式
load csv from "file:///本地路径" as 别名
create (:标签名 {字段1:别名{索引},字段2:别名{索引},...})
# demo
load csv from "file:///xiyou/西游关系表.csv" as line
create (:xiyouRelation {from:line{1},relation:line{3},to:line{0}})
#2. 创建关系
# 命令格式
match...
create (开始节点)-[关系]->(目标节点)
# demo
match (m:xiyouPerson),(n:xiyouRelation),(s:xiyouPerson) where m.name = n.from and s.name = n.to
create (m:xiyouPersonNew)-[n.relation]->(n:xiyouPersonNew)
#3. 创建多标签节点
# 命令格式
create (变量:标签1:标签2... {})
# demo
create (n:student:person {name:"张三",age:23})
查询
#1. 查询节点
# 命令格式
match (变量:标签 {字段:条件值}) where 条件 return 变量
# demo
match (n:xiyouPerson {name:"孙悟空"}) return n
#注意:如果id是数据库自动生成的,则单独查询id时,需要用id(变量)查询
match (n:xiyouPerson {name:"孙悟空"}) return n.name,id(n)
match (n:xiyouPerson) where n.name = "孙悟空" return n
#多标签查询
match (m:xiyouPerson),(n:xiyouRelation) where m.name = n.from return m.name,n.relation,n.to
#2. 查询关系
# 命令格式
match 变量 = (开始节点)-[关系]->(目标节点) where 条件 return 变量
# demo
match p = ()-[r:xiyougx]->(n:xiyouPerson) where n.name = "沙僧" return p
#3. 排序
# 命令格式
match ... return ... order by 字段 asc/desc
# demo
match (n:xiyouPerson) return id(n),n.name order by id(n) desc
#4. 分页查询
# 限制返回条数
match (n:xiyouPerson) return id(n),n.name order by id(n) desc limit 10
# 跳过前10条
match (n:xiyouPerson) return id(n),n.name order by id(n) desc skip 10
#5. 并集查询(注意并集查询必须保证字段名相同,所以要起别名)
# 并集去重
match (n:xiyouPerson) return n.name as name
union
match (m:person) return m.name as name
# 并集不去重
match (n:xiyouPerson) return n.name as name
union all
match (m:person) return m.name as name
#6. 查询有某个属性的节点(null)注意:即便那个属性的值是空串,那个属性也是存在的,唯有这个属性不存在才能满足下面的查询
match (n:xiyouPerson) where n.label is not null return n
#7. in的用法
match (n:xiyouPerson) where n.name in['孙悟空','唐僧'] return n
#
删除
#1. 删除节点
# 命令格式
match (变量:标签名)
delete 变量
# demo
match (n:xiyouRelation)
delete n
#2. 删除关系
# 命令格式
match ()-[变量:关系类型]->() where 条件
delete 变量
# demo
match ()-[r:xiyougx]->(n:xiyouPerson) where n.name = "沙僧"
delete r
#3. 移除节点标签
# 命令格式
match (变量:标签1:标签2... {name:"张三"})
remove 变量:移除的标签
# demo
match (n:student:person {name:"张三"}) remove n:student
#4. 移除节点的属性
# 命令格式
match (变量:标签 {})
remove 变量.移除属性
# demo
match (n:person {name:"张三"}) remove n.age
修改
#1. 添加或修改属性的值
# 命令格式
match (变量:标签 {})
set 变量.属性名 = 值
# demo
match (n:person {name:"张三"})
set n.age = 23
索引
# 创建索引
create index on :xiyouPerson(name)
# 删除索引
drop index on :xiyouPerson(name)
约束
# 唯一约束:unique
create constraint on (n:xiyouPerson) assert n.name is unique
函数
- 字符串函数:
- upper 大写
- lower 小写
- substring 截取
- replace 替换
- 聚合函数:
- count
- max
- min
- sum
- avg
- 关系函数
- startnode 关系开始节点
- endnode 关系结束节点
- id 关系ID
- type 关系的类型
# 去重
match (n:xiyouPerson) return distinct(n.name)
备份
1. 关闭数据库
neo4j install service
neo4j stop
2. 备份
neo4j-admin dump --database=graph.db --to=/neo4j/backup/graph_backup.dump
3. 恢复
neo4j-admin load --from=/neo4j/backup/graph_backup.dump --database=graph.db --force
SpringBoot集成
环境
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
创建实体类
import org.springframework.data.neo4j.core.schema.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
@Node("xiyouPerson")
public class XiYouPerson implements Serializable {
@Id
@GeneratedValue
private Long id;
@Property
private String name;
}
dao层
@Repository
public interface XiyouPersonDao extends Neo4jRepository<XiYouPerson,Long> {
}
controller层
import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
import org.neo4j.driver.Session;
import org.neo4j.driver.Value;
import org.neo4j.driver.types.Node;
import org.neo4j.driver.types.Path;
import org.neo4j.driver.types.Relationship;
@CrossOrigin(origins ="*",maxAge =3600)
@RestController
@RequestMapping("/neo4j")
public class Neo4jController {
@Autowired
private XiyouPersonDao xiyouPersonDao;
@Autowired
private Driver driver;
@RequestMapping(value = "/queryByCQLGX.do" , produces = "application/json;charset=utf-8" ,method = RequestMethod.GET)
public Result queryByCQLGX(){
org.neo4j.driver.Result result = driver.session().run("MATCH p=()-[r:xiyougx]->() RETURN p LIMIT 25");
List<Record> list = result.list();
List<Map<String, Object>> maps = new ArrayList<>();
for (Record record : list) {
Map<String, Object> map = new HashMap<>();
Path p = record.get("p").asPath();
Map<String, Object> startNode = new HashMap<>(p.start().asMap());
map.put("startNode",startNode);
Map<String, Object> endNode = new HashMap<>(p.end().asMap());
map.put("endNode",endNode);
Iterator<Relationship> iterator = p.relationships().iterator();
while(iterator.hasNext()){
Relationship next = iterator.next();
Map<String, Object> relationShipMap = new HashMap<>(next.asMap());
map.put("relationShip",relationShipMap);
}
maps.add(map);
}
return new Result(RequestCode.SUCCESS,"查询成功!",true,maps);
}
@RequestMapping(value = "/queryByID.do" , produces = "application/json;charset=utf-8" ,method = RequestMethod.GET)
public Result queryByID(long id){
Optional<XiYouPerson> byId = xiyouPersonDao.findById(id);
XiYouPerson xiYouPerson = byId.get();
return new Result(RequestCode.SUCCESS,"查询成功!",true,xiYouPerson);
}
@RequestMapping(value = "/addXiyouPerson.do" , produces = "application/json;charset=utf-8" ,method = RequestMethod.POST)
public Result addXiyouPerson(String name){
XiYouPerson xiYouPerson = new XiYouPerson();
xiYouPerson.setName(name);
XiYouPerson newXiyouPerson = xiyouPersonDao.save(xiYouPerson);
return new Result(RequestCode.SUCCESS,"新增成功!",true,newXiyouPerson);
}
}