Neo4j(部署&原理&使用&常用查询)
1. 部署Neo4j
1.1 下载Neo4j并解压
## 下载地址:http:##dist.neo4j.org/neo4j-community-3.5.25-unix.tar.gz
## 百度网盘/A常用下载/大数据组件/neo4j
tar -zxvf neo4j-community-3.5.25-unix.tar.gz -C /opt/hadoop/
1.2 配置Neo4j
1)主节点
##在默认配置下,Neo4j只接受本地连接,配置本机ip
dbms.connectors.default_listen_address=master
##客户端可以访问该服务器的地址。这可能是服务器的IP地址或DNS名称
dbms.connectors.default_advertised_address=master
##neo4j集群模式
dbms.mode=HA
##id=1表示主节点
ha.server_id=1
##集群初始化三个节点信息
ha.initial_hosts=master:5001,worker01:5001,worker02:5001
##此实例要侦听的IP和端口,用于通信集群状态
ha.host.coordination=master:5001
##此实例要监听的IP和端口,用于通信事务
ha.host.data=master:6001
##是否开启bolt连接方式
dbms.connector.bolt.enabled=true
##bolt监听地址
dbms.connector.bolt.listen_address=master:7687
##是否开启http连接方式
dbms.connector.http.enabled=true
##http监听地址
dbms.connector.http.listen_address=master:7474
##是否开启https连接方式
dbms.connector.https.enabled=true
##https监听地址
dbms.connector.https.listen_address=master:7473
1.3 分发Neo4j
scp -r neo4j-community-3.5.25/ root@worker01:/opt/hadoop/
scp -r neo4j-community-3.5.25/ root@worker02:/opt/hadoop/
2)从节点01配置
##在默认配置下,Neo4j只接受本地连接,配置本机ip
dbms.connectors.default_listen_address=worker01
##客户端可以访问该服务器的地址。这可能是服务器的IP地址或DNS名称
dbms.connectors.default_advertised_address=worker01
##neo4j集群模式
dbms.mode=HA
##id=1表示主节点
ha.server_id=2
##集群初始化三个节点信息
ha.initial_hosts=master:5001,worker01:5001,worker02:5001
##此实例要侦听的IP和端口,用于通信集群状态
ha.host.coordination=worker01:5001
##此实例要监听的IP和端口,用于通信事务
ha.host.data=worker01:6001
##是否开启bolt连接方式
dbms.connector.bolt.enabled=true
##bolt监听地址
dbms.connector.bolt.listen_address=worker01:7687
##是否开启http连接方式
dbms.connector.http.enabled=true
##http监听地址
dbms.connector.http.listen_address=worker01:7474
##是否开启https连接方式
dbms.connector.https.enabled=true
##https监听地址
dbms.connector.https.listen_address=worker01:7473
3)从节点02配置
##在默认配置下,Neo4j只接受本地连接,配置本机ip
dbms.connectors.default_listen_address=worker02
##客户端可以访问该服务器的地址。这可能是服务器的IP地址或DNS名称
dbms.connectors.default_advertised_address=worker02
##neo4j集群模式
dbms.mode=HA
##id=1表示主节点
ha.server_id=3
##集群初始化三个节点信息
ha.initial_hosts=master:5001,worker01:5001,worker02:5001
##此实例要侦听的IP和端口,用于通信集群状态
ha.host.coordination=worker02:5001
##此实例要监听的IP和端口,用于通信事务
ha.host.data=worker02:6001
##是否开启bolt连接方式
dbms.connector.bolt.enabled=true
##bolt监听地址
dbms.connector.bolt.listen_address=worker02:7687
##是否开启http连接方式
dbms.connector.http.enabled=true
##http监听地址
dbms.connector.http.listen_address=worker02:7474
##是否开启https连接方式
dbms.connector.https.enabled=true
##https监听地址
dbms.connector.https.listen_address=worker02:7473
1.4 启动Neo4j
## 每台都要启动
./neo4j start/restart/stop //启动/重启/停止
1.5 界面访问
## http://master:7474/browser/
## 账户:neo4j
## 密码:neo4j ## 新密码:fubo123456
1.6 因果集群配置
什么是neo4j因果集群?
Neo4j因果集群是Neo4j 3.1版本时代引入的一个全新的高可用集群功能。它基于Raft算法构建,是一个分布式计算集群,主要着眼于提供全面的数据安全,即事务安全操作和可用性。因果集群在集群内的不同角色(核心服务器和读取副本)之间分离读/写数据库活动,从而实现对巨量吞吐量的支撑、包括读取自己的写入(read-your-own-writes)的一致性级别的读取时间选择,以及高可用性。
与普通的集群相比,因果集群提供了远超最终一致性的、最为简单但最充分的一致性保证。这意味着无论集群的规模如何,你都可以随后读取你所写的内容。此外,因果集群还支持地理区域之间的数据复制,并在发生多个硬件和网络故障时支持持续的读写操作,对硬件和网络的容错率高。
而普通的集群,如HA集群,主要由三台服务器组成,其中一台为主服务器,其余为从服务器。主服务器负责写入操作并同步数据到从服务器,同时主服务器和从服务器都可以进行读取操作。HA集群主要用于全天候正常运行并提高读取性能,适用于需要全天候运行并需要提高查询效率的场景。
总的来说,Neo4j因果集群通过其独特的架构和算法,提供了比传统集群更高的一致性保证和容错性,使其在处理大规模图数据和保证数据安全方面表现出色。
---master
##该机器用于侦听传入消息的地址或网络接口
dbms.connectors.default_listen_address=master
##其他机器被告知连接的地址。在典型情况下,应将其设置为该服务器的完全限定域名或 IP 地址
dbms.connectors.default_advertised_address=master
##服务器实例的运行模式。主服务器设置为CORE
dbms.mode=CORE
##形成时集群中核心实例的最小数量。如果没有此设置定义的核心数量,则不会形成集群,通常应将其配置为完整且固定的数量。
causal_clustering.minimum_core_cluster_size_at_formation=3
##共识组中存在的最小 Core 实例数量。
causal_clustering.minimum_core_cluster_size_at_runtime=3
##可用于引导此核心或只读副本实例的一组初始核心集群成员的网络地址。在默认情况下,初始发现成员以逗号分隔的地址/端口对列表的形式给出,发现服务的默认端口为:5000。最好在所有核心服务器上将此参数设置为相同的值。
causal_clustering.initial_discovery_members=master:5000,worker01:5000,worker02:5000
##用于绑定集群成员发现管理通信的主机和端口
causal_clustering.discovery_listen_address=master:5000
##是否开启bolt连接方式
dbms.connector.bolt.enabled=true
##bolt监听地址
dbms.connector.bolt.listen_address=master:7687
##是否开启http连接方式
dbms.connector.http.enabled=true
##http监听地址
dbms.connector.http.listen_address=master:7474
##是否开启https连接方式
dbms.connector.https.enabled=true
##https监听地址
dbms.connector.https.listen_address=master:7473
-----worker01
##该机器用于侦听传入消息的地址或网络接口
dbms.connectors.default_listen_address=worker01
##其他机器被告知连接的地址。在典型情况下,应将其设置为该服务器的完全限定域名或 IP 地址
dbms.connectors.default_advertised_address=worker01
##服务器实例的运行模式。主服务器设置为CORE
dbms.mode=CORE
##形成时集群中核心实例的最小数量。如果没有此设置定义的核心数量,则不会形成集群,通常应将其配置为完整且固定的数量。
causal_clustering.minimum_core_cluster_size_at_formation=3
##共识组中存在的最小 Core 实例数量。
causal_clustering.minimum_core_cluster_size_at_runtime=3
##可用于引导此核心或只读副本实例的一组初始核心集群成员的网络地址。在默认情况下,初始发现成员以逗号分隔的地址/端口对列表的形式给出,发现服务的默认端口为:5000。最好在所有核心服务器上将此参数设置为相同的值。
可以通过配置该设置来修改此设置的行为causal_clustering.discovery_type
causal_clustering.initial_discovery_members=master:5000,worker01:5000,worker02:5000
##是否开启bolt连接方式
dbms.connector.bolt.enabled=true
##bolt监听地址
dbms.connector.bolt.listen_address=worker01:7687
##是否开启http连接方式
dbms.connector.http.enabled=true
##http监听地址
dbms.connector.http.listen_address=worker01:7474
##是否开启https连接方式
dbms.connector.https.enabled=true
##https监听地址
dbms.connector.https.listen_address=worker01:7473
----worker02
##该机器用于侦听传入消息的地址或网络接口
dbms.connectors.default_listen_address=worker02
##其他机器被告知连接的地址。在典型情况下,应将其设置为该服务器的完全限定域名或 IP 地址
dbms.connectors.default_advertised_address=worker02
##服务器实例的运行模式。主服务器设置为CORE
dbms.mode=CORE
##形成时集群中核心实例的最小数量。如果没有此设置定义的核心数量,则不会形成集群,通常应将其配置为完整且固定的数量。
causal_clustering.minimum_core_cluster_size_at_formation=3
##共识组中存在的最小 Core 实例数量。
causal_clustering.minimum_core_cluster_size_at_runtime=3
##可用于引导此核心或只读副本实例的一组初始核心集群成员的网络地址。在默认情况下,初始发现成员以逗号分隔的地址/端口对列表的形式给出,发现服务的默认端口为:5000。最好在所有核心服务器上将此参数设置为相同的值。
可以通过配置该设置来修改此设置的行为causal_clustering.discovery_type
causal_clustering.initial_discovery_members=master:5000,worker01:5000,worker02:5000
##是否开启bolt连接方式
dbms.connector.bolt.enabled=true
##bolt监听地址
dbms.connector.bolt.listen_address=worker02:7687
##是否开启http连接方式
dbms.connector.http.enabled=true
##http监听地址
dbms.connector.http.listen_address=worker02:7474
##是否开启https连接方式
dbms.connector.https.enabled=true
##https监听地址
dbms.connector.https.listen_address=worker02:7473
2. 使用Neo4j
2.1 页面介绍
账户密码:neo4j/fubo123456
2.2 生成数据
-- 执行Cypher来检验数据
LOAD CSV WITH HEADERS
FROM 'https://data.neo4j.com/v4.0-intro-neo4j/people.csv'
AS line
WITH line WHERE line.birthYear > "1999"
RETURN line LIMIT 10
-- 导入movies1数据
:auto USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM
'https://data.neo4j.com/v4.0-intro-neo4j/movies1.csv' as row
MERGE (m:Movie {id:toInteger(row.movieId)})
ON CREATE SET
m.title = row.title,
m.avgVote = toFloat(row.avgVote),
m.releaseYear = toInteger(row.releaseYear),
m.genres = split(row.genres,":")
-- 导入演员结点
:auto USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM
'https://data.neo4j.com/v4.0-intro-neo4j/people.csv' as row
MERGE (p:Person {id:toInteger(row.personId)})
ON CREATE SET
p.name=row.name,
p.birthYear=toInteger(row.birthYear),
p.deathYear=toInteger(row.deathYear)
-- 导入“导演”匹配关系
:auto USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM
'https://data.neo4j.com/v4.0-intro-neo4j/directors.csv' AS row
MATCH (movie:Movie {id:toInteger(row.movieId)})
MATCH (person:Person {id: toInteger(row.personId)})
MERGE (person)-[:DIRECTED]->(movie)
ON CREATE SET person:Director
-- 为图数据添加索引
CREATE INDEX MovieTitleIndex FOR (m:Movie) ON (m.title);
CREATE INDEX PersonNameIndex FOR (p:Person) ON (p.name)
-- 创建约束
CREATE CONSTRAINT UniqueMovieIdConstraint ON (m:Movie) ASSERT m.id IS UNIQUE;
CREATE CONSTRAINT UniquePersonIdConstraint ON (p:Person) ASSERT p.id IS UNIQUE
2.3 neo4j常用查询
## 1. 查询所有节点
MATCH (n)
RETURN n;
## 2. 所有关系及其连接的节点
MATCH p=()-[r]->()
RETURN p limit 100;
## 3. 查询所有关系
MATCH ()-[r]->()
RETURN DISTINCT type(r) AS relationshipType
ORDER BY relationshipType;
## 4. 查询特定节点
MATCH (n:Person)
RETURN n limit 100;
----
MATCH (n:Movie)
RETURN n limit 100;
## 5. 查询节点带条件
MATCH (n:Person {name: 'Tom Burke'}) RETURN n;
MATCH (n:Person) WHERE n.birthYear > 1980 RETURN n.name, n.birthYear;
MATCH (n:Person) WHERE n.birthYear > 1980 RETURN n limit 100;
## 6. 查询匹配关系
MATCH (a:Person)-[:DIRECTED]->(b:Movie) RETURN a, b;
## 7. 创建节点
CREATE (a:Person {name: 'Alice', age: 30}),
(b:Person {name: 'Bob', age: 25})
RETURN a, b;
---## 创建节点时记载数据
LOAD CSV WITH HEADERS FROM "file:///people.csv" AS row
CREATE (:Person {name: row.name, age: toInteger(row.age)});
---
## 8. 创建关系
CREATE (a:Person {name: 'Alice', age: 30})-[:FRIENDS]->(b:Person {name: 'Bob', age: 25})
RETURN a, b;
3. neo4j图数据的原理
3.1 neo4j基本的数据结构
Neo4j图数据库的基本数据结构主要包括节点(Nodes)和关系(Relationships)。
节点(Nodes):在图数据库中,节点是基本的数据对象,用于表示实体或概念。每个节点可以有多个属性,这些属性以键值对(key-value pair)的形式存储,用于描述节点的特征或属性。节点可以有标签(Labels),用于对节点进行分类或标识。
关系(Relationships):在Neo4j中,关系用于表示节点之间的连接或关联。关系总是有方向性的,从一个节点指向另一个节点。关系也有类型,用于描述节点之间连接的性质或类型。同样,关系也可以有属性,这些属性提供了关于关系的额外信息。
通过这些基本的数据结构,Neo4j能够构建出一个灵活且强大的图模型,用于表示和处理复杂的数据关系。这种数据结构使得Neo4j在处理关系型数据时具有出色的性能和效率。
此外,Neo4j的数据存储原理也是其数据结构的重要组成部分。Neo4j将数据库文件持久化到磁盘存储中,以获得长期的持久性。数据文件通常包括节点信息、关系信息、属性信息和标签数据等部分,并使用固定的记录长度来持久化数据,通过文件中的偏移量快速进行数据的插入和查询。这种存储原理使得Neo4j在处理大规模图数据时能够保持高效和稳定。
Tips: 节点也就是图数据中的顶点,关系也被称为边
3.2 neo4j的原理
图数据库,其实就是用图的形式,来表现各个节点之间的关系,其本质还是关系型数据库,我可以这样理解吗?
---
您的理解部分正确,但并不完全准确。图数据库确实是用图的形式来表现各个节点之间的关系,但它们的本质并不等同于关系型数据库。尽管两者都涉及到数据的关联和连接,但它们在数据结构、查询方式、优化策略等方面存在显著的差异。
关系型数据库(如MySQL、Oracle等)是基于表格的,它们通过定义明确的表格结构和关系(如主键、外键等)来存储和查询数据。这种结构在处理结构化数据时非常有效,但在处理复杂关系或需要频繁查询跨多个表的数据时可能会变得低效。
图数据库(如Neo4j)则是基于图的,它们使用节点和关系来直接表示数据之间的连接和关联。这种结构使得图数据库在处理具有复杂关系的数据时非常高效,因为它们可以直接在内存中操作图结构,而无需像关系型数据库那样进行复杂的表连接操作。此外,图数据库的查询语言(如Cypher)也专门针对图结构进行了优化,使得查询操作更加直观和高效。
因此,虽然图数据库和关系型数据库都涉及到数据的关联和连接,但它们在数据结构、查询方式、优化策略等方面存在显著的差异。图数据库更适合处理具有复杂关系的数据,而关系型数据库则更适合处理结构化数据。所以,我们不能简单地将图数据库理解为只是用图的形式来表现各个节点之间关系的关系型数据库
那图数据库底层的查询优化,和传统的关系型数据有什么不同吗?
---
图数据库底层的查询优化与传统的关系型数据库在多个方面存在显著的差异。以下是它们之间的一些主要不同点:
数据结构差异:
关系型数据库:基于表格和行列结构,数据以固定的模式存储,通过主键和外键等约束来维护数据之间的关系。
图数据库:以节点和关系为基础,直接表示数据之间的连接和关联,数据结构更加灵活,能够轻松表示复杂的关系模式。
查询方式:
关系型数据库:使用SQL语言进行查询,通过连接、过滤和聚合等操作从多个表中检索数据。查询优化通常涉及索引的选择、表的连接顺序和过滤条件的优化等。
图数据库:使用图查询语言(如Cypher),直接针对图结构进行查询。查询优化更多地关注于图模式的匹配、路径的查找和关系的遍历等。
索引策略:
关系型数据库:通常使用B树、哈希等索引结构来加速数据检索。索引的选择和创建对于查询性能至关重要。
图数据库:索引策略可能包括节点和关系的属性索引,以及针对图模式的索引。由于图数据的复杂性和非结构化特性,索引的选择和创建更加复杂和多样化。
查询优化器:
关系型数据库:查询优化器会根据查询的语义、统计信息和系统资源来生成高效的查询计划。
图数据库:查询优化器会考虑图的结构特征、节点和关系的分布以及查询的复杂性等因素来生成高效的查询计划。它可能还需要考虑路径的搜索策略、子图的匹配以及并行处理等。
可扩展性和分布式处理:
关系型数据库:在处理大规模数据时,通常需要复杂的分片、分区和复制策略来实现水平扩展。
图数据库:由于图数据的分布式特性,图数据库更容易实现水平扩展和分布式处理。它们可以利用节点和关系的分布来并行处理查询,提高整体性能。
综上所述,图数据库底层的查询优化与传统的关系型数据库存在显著的差异。这些差异主要源于它们不同的数据结构和查询方式,以及针对各自特点所采取的优化策略。
4. 图数据的应用
在金融风控中,图数据的具体作用是什么,主要有哪些节点和关系,可以举例说明吗?
----
在金融风控中,图数据具有非常具体和重要的作用。图数据库以图结构为基础,能够直观展示金融数据的内在联系,并通过节点和边表示数据之间的关联关系。这种数据结构使得图数据库在金融风控领域具有独特的优势。
首先,图数据的主要节点和关系可以包括用户、交易、账户、设备等。这些节点通过诸如转账、关联、登录等操作关系相互连接,形成复杂的金融网络。
具体来说,在金融风控中,图数据的应用主要体现在以下几个方面:
信用评估:图数据库能够整合用户的个人信息、历史交易记录和其他相关数据,通过图算法和分析技术来评估用户的信用风险。例如,通过分析用户的社交网络,图数据库可以评估用户的社交影响力,从而推断其可能的违约风险。
风险控制:通过构建用户和交易的关联关系图,图数据库能够实时监控和识别异常行为和可疑团伙,提高欺诈风险的识别能力。例如,如果多个账户之间存在频繁的交易或关联交易,图数据库可以迅速发现并预警,以防止潜在的洗钱或团伙欺诈行为。
反欺诈:图数据库能够实时监控交易过程,通过申请注册IP、设备号、手机号、地理经纬度等多个维度实时分析欺诈行为,及时发现并阻止欺诈交易,提升申请/交易欺诈识别率,避免可能出现的经济损失。
举例来说,在团伙欺诈识别方面,金融机构可以利用图数据库关联网络来捕捉非法贷款中介团伙,并通过分析其转移地点、使用的网络设备等特征,持续监控并拒绝其授信申请,从而有效避免欺诈损失。
此外,图数据库还支持多种图算法,如K-core、Louvain等,这些算法能够提升欺诈团伙识别效率,为金融机构提供更准确的风险识别和分析结果。
总的来说,图数据在金融风控中的应用不仅提升了风险控制和反欺诈的效率和准确性,还为金融机构提供了有力的决策支持。