Neo4j图形数据库和Cypher查询语言的学习与应用

一,下载与安装

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采用一对圆括号来表示节点。如节点

img

的表示:

img节点语法

其中,标识符、标签、属性都可以省略。

标识符:就是起的变量名,用来保存节点,后面也可以使用他来引用。

标签:代表节点的类型,节点可以有多个标签,也可以没有。

属性:花括号{}代表节点的属性,属性类似Python的字典。

2-Cypher采用一对短横线(即--)表示一个无方向关系,有向关系在其中一段加上一个箭头(即->或<-);方括号[…]中可以添加详情。如:

img关系

标识符:就是起的变量名,用来保存关系,后面也可以使用他来引用。

标签:代表关系的类型,节点可以有多个标签,也可以没有。

属性:花括号{}代表关系的属性,属性类似Python的字典。

3-Cypher的语法模式

语法模式=节点+关系+节点

img

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;

此处转载于文章:https://www.cnblogs.com/godlover/p/14620387.html

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;

四,模式

此处转载于文章:https://www.cnblogs.com/ljhdo/p/5516793.html

模式,用于描述如何搜索数据,模式的格式是:使用()标识节点,使用[]标识关系,为了更有效地使用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,如图:

img

查询模式是:查找跟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": "袁梦阳"
  }
]
posted @ 2021-07-21 11:48  你樊不樊  阅读(337)  评论(0编辑  收藏  举报