一,下载与安装
Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。
linux环境Neo4j下载地址:https://neo4j.com/download/other-releases/#releases (社区版免费)
二,解压与配置
解压
配置neo4j的配置文件neo4j.conf文件
修改第22行load csv时l路径,在前面加个#,可从任意路径读取文件
dbms.directories.import=import
修改35行和36行,设置JVM初始堆内存和JVM最大堆内存
生产环境给的JVM最大堆内存越大越好,但是要小于机器的物理内存
dbms.memory.heap.initial_size=5g
dbms.memory.heap.max_size=10g修改46行,可以认为这个是缓存,如果机器配置高,这个越大越好
dbms.memory.pagecache.size=10g
修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库
dbms.connectors.default_listen_address=0.0.0.0
默认 bolt端口是7687,http端口是7474,https关口是7473,不修改下面3项也可以
修改71行,去掉#,设置http端口为7687,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.bolt.listen_address=:7687
修改75行,去掉#,设置http端口为7474,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.http.listen_address=0.0.0.0:7474
修改79行,去掉#,设置http端口为7473,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.https.listen_address=0.0.0.0:7473
修改227行,去掉#,允许从远程url来load csv
dbms.security.allow_csv_import_from_file_urls=true
修改246行,允许使用neo4j-shell,类似于mysql 命令行之类的
dbms.shell.enabled=true
修改235行,去掉#,设置连接neo4j-shell的端口,一般都是localhost或者127.0.0.1,这样安全,其他地址的话,一般使用https就行
dbms.shell.host=127.0.0.1
修改250行,去掉#,设置neo4j-shell端口,端口可以自定义,只要不和其他端口冲突就行
dbms.shell.port=1337
修改254行,设置neo4j可读可写
dbms.read_only=false
配置完成后执行命令
./bin/neo4j start
./bin/neo4j stop
./bin/neo4j status
进入http://tiger2.cn:7474/browser/ 即可访问
初始化用户名和密码均为neo4j
三,Cypher查询语言
1,neo4j查询语言Cypher介绍
Cypher是一种是一种声明式图查询语言,类似于关系型数据库的sql语言。
常用的语句:
MATCH:匹配图模式,从图中获取数据的常见方式
WHERE:不是独立的语句,而是MATCH,OPTION MATCH 和 WITH 的一部分,用于给模式添加约束或者过滤传递给WITH的中间结果
CREATE和DELETE:创建和删除节点关系
SET和REMOVE:使用SET设置属性值和给节点添加标签,使用REMOVE移除他们
MERGE:匹配已经存在的或者创建新节点和模式,对于有唯一性约束的时候非常有用
RETURN: 定义返回的结果。
二:neo4j查询语言Cypher的三要素
Cypher三要素包括节点语法,关系语法,还有语法模式。
1-Cypher采用一对圆括号来表示节点。如节点
的表示:
节点语法
其中,标识符、标签、属性都可以省略。
标识符:就是起的变量名,用来保存节点,后面也可以使用他来引用。
标签:代表节点的类型,节点可以有多个标签,也可以没有。
属性:花括号{}代表节点的属性,属性类似Python的字典。
2-Cypher采用一对短横线(即--)表示一个无方向关系,有向关系在其中一段加上一个箭头(即->或<-);方括号[…]中可以添加详情。如:
关系
标识符:就是起的变量名,用来保存关系,后面也可以使用他来引用。
标签:代表关系的类型,节点可以有多个标签,也可以没有。
属性:花括号{}代表关系的属性,属性类似Python的字典。
3-Cypher的语法模式
语法模式=节点+关系+节点
2,节点操作
2.1,创建节点
create (:Test{id:'123456',name:'小明',address:'北京市海淀区'})
create (:TestParent{id:'789012',name:'小明父亲',address:'北京市海淀区'})
2.2,创建关系
关系的构成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型。
创建没有任何属性的关系
match (test:Test),(parent:TestParent) where test.id='123456' and parent.id='789012' create (parent)-[r:DIRECTED]->(test)
[r:DIRECTED]说明:r为别名,DIRECTED为自定义关系名称,其实也是一个对象,也可以指定属性,这里没有属性。
创建关系,并设置关系的属性
match (test:Test),(parent:TestParent) where test.id='123456' and parent.id='789012' create (parent)-[r:ACTED_IN{haha:['测试']}]->(test)
2.3,删除指定关系
match (test:Test)-[r:DIRECTED]-(parent:TestParent)
delete r
2.4,删除所有孤立节点
MATCH (n) WHERE NOT (n)--() DELETE n
3,查询节点和关系
通过match子句查询数据库,match子句用于指定搜索的模式(Pattern),where子句为match模式增加谓词(Predicate),用于对Pattern进行约束
在Cypher中,关系分为三种:符号“--”,表示有关系,忽略关系的类型和方向;符号“-->”和“<--”,表示有方向的关系;
3.1,查询整个图形数据库
match(n) return n;
3.2,查询name为小明的节点
match (n) where n.name='小明' return n
3.3,查询跟指定节点有关系的节点
示例脚本返回跟父亲标签有关系的所有节点
match (n)--(test:TestParent) return n;
3.4,match基础查询
match(s:school) return s limit 25
3.5,带有关系的查询
match(match(a:academy) -[:Belong_to]->(s:school) return a,s limit 15)
3.6,带有条件的关系查询
match(d:discipline)-[:Belong_to]->(a:academy) where a.academy_id="19" return d,a limit 30
3.7,多维度关联查询
match(p:project) -[:Be_from]->(d:discipline)-[:Belong_to]->(a:academy) where a.academy_name = "机电工程学院" return p,d,a limit 10
3.8,没有限制实体的关系查询
match n=()-[:Belong_to]-() return n limit 50
3.9,正则查询/模糊匹配查询
match (s:school) where s.school_name=~"苏.*" return s limit 10
3.10,包含查询
match (p:project) where p.project_name contains "网络" return p limit 10
3.11,查询节点之间存在关系的路径
查找所有存在关系的路径
match r=(a:Start{name:"谢霆锋"})-[*..5]->(b:Star{name:"周星驰"}) return r;
查找关系最近的一条路径
match r=shortestpath((a:Start{name:"谢霆锋"})-[*..5]->(b:Star{name:"周星驰"})) return r;
4,更新图形操作
set子句,用于更新节点的标签和实体的属性;remove子句用于移除实体的属性和节点的标签;
4.1,为节点增加属性
通过节点的ID获取节点,Neo4j推荐通过where子句和ID函数来实现。
match (n) where id(n)=40 set n.testKey='testValue' return n;
4.2,为节点增加标签
match (n) where id(n)=40 set n:company return n;
4.3,为关系增加属性
match (n)<-[r]-(m)
where id(n)=7 and id(m)=8
set r.team='Azure'
return n;
四,模式
模式,用于描述如何搜索数据,模式的格式是:使用()标识节点,使用[]标识关系,为了更有效地使用Cypher查询,必须深入理解模式。
1,节点模式
节点具有标签和属性,Cypher为了引用节点,需要给节点命名:
- (n) :该模式用于描述节点,节点的变量名是n;匿名节点是();
- (n:lable):该模式用于描述节点,节点具有特定的标签lable;也可以指定多个标签;
- (n{name:"Vic"}):该模式用于描述节点,节点具有name属性,并且name属性值是“Vic”;也可以指定多个属性;
- (n:lablle{name:"Vic"}):该模式用于描述节点,节点具有特定的标签和name属性,并且name属性值是“Vic”;
2,关系模式
在属性图中,节点之间存在关系,关系通过[]表示,节点之间的关系通过箭头()-[]->()表示,例如:
- [r]:该模式用于描述关系,关系的变量名是r;匿名关系是[]
- [r:type]:该模式用于描述关系,关系类型是type;每一个关系必须有且仅有一个类型;
- [r:type{name:"Friend"}]:该模式用于描述关系,关系的类型是type,关系具有属性name,并且name属性值是“Friend”;
3,关联节点模式
节点之间通过关系联系在一下,由于关系具有方向性,因此,-->表示存在有向的关系,--表示存在关联,不指定关系的方向,例如:
- (a)-[r]->(b) :该模式用于描述节点a和b之间存在有向的关系r,
- (a)-->(b):该模式用于描述a和b之间存在有向关系;
4,变长路径的模式
从一个节点,通过直接关系,连接到另外一个节点,这个过程叫遍历,经过的节点和关系的组合叫做路径(Path),路径是由节点和关系的有序组合。
- (a)-->(b):是步长为1的路径,节点a和b之间有关系直接关联;
- (a)-->()-->(b):是步长为2的路径,从节点a,经过两个关系和一个节点,到达节点b;
Cypher语言支持变长路径的模式,变长路径的表示方式是:[*N..M],N和M表示路径长度的最小值和最大值。
- (a)-[*2]->(b):表示路径长度为2,起始节点是a,终止节点是b;
- (a)-[*3..5]->(b):表示路径长度的最小值是3,最大值是5,起始节点是a,终止节点是b;
- (a)-[*..5]->(b):表示路径长度的最大值是5,起始节点是a,终止节点是b;
- (a)-[*3..]->(b):表示路径长度的最小值是3,起始节点是a,终止节点是b;
- (a)-[*]->(b):表示不限制路径长度,起始节点是a,终止节点是b;
5,路径变量
路径可以指定(assign)给一个变量,该变量是路径变量,用于引用查询路径。
p = (a)-[*3..5]->(b)
6,示例
以下示例图有6个节点,每个节点都有一个属性name,节点之间存在关系,关系类型是KNOWS,如图:
查询模式是:查找跟Filipa有关系的人,路径长度为1或2,查询的结果是:"Dilshad"和"Anders"
MATCH (me)-[:KNOWS*1..2]-(remote_friend)
WHERE me.name = 'Filipa'
RETURN remote_friend.name
五,springboot整合neo4j
说明:springboot采用1.5.9.RELEASE版本,原因是2.X与1.X分别和neo4j整合差别较大!! |
1,添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
2,application.properties配置neo4j
spring.data.neo4j.uri=http://***.***.***.***:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=*****
3,neo4j的配置类
也可加在启动类上,道理一样
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableNeo4jRepositories(basePackages = "io.fredia.femicro.graph.repository")
@EnableTransactionManagement // 激活SDN隐式事务
public class Neo4jConfig {
}
@Configuration:springboot声明配置类,一般为单例模式
@EnableNeo4jRepositories:Neo4j扫描Repositories所在包,理解为mybatis扫描mapper包
@EnableTransactionManagement:Neo4j完整的支持ACID,所以此处开启事务功能。
4,创建节点类
@NodeEntity(label = "Test")
public class Test {
@GraphId
private Long nodeId;
@Property(name = "id")
private String id;
@Property(name = "name")
private String name;
//省略set、get
}
@NodeEntity:声明该类为Neo4j的节点类
@GraphId:Neo4j的主键id,必须为长整型
@Property:Neo4j的节点属性值,支持8种基本类型外加String(可以省略不写)
5,创建repository类
前提:创建repository包并在配置类的注解对该包进行扫描! |
@Component
public interface TestRepository extends GraphRepository<Test> {
@Query(value = "match (n:Test) return n")//查询所有标签为Test的节点
List<Test> getNeo4jData();
}
6,service + controller接口测试
@Autowired
private TestRepository testRepository;
public List<Test> getNeo4jData(){
return testRepository.getNeo4jData();
}
@GetMapping("/getNeo4jData")
public List<Test> getNeo4jData(){
List<Test> neo4jData = manager.getNeo4jData();
return neo4jData;
}
请求http://localhost:8080/getNeo4jData,响应结果
[
{
"nodeId": 0,
"id": "123456",
"name": "小明"
},
{
"nodeId": 40,
"id": "562345",
"name": "小亮"
},
{
"nodeId": 60,
"id": "66666",
"name": "袁梦阳"
}
]
作者:樊同学