neo4j图数据库

2024-07-08 14:21:21 浏览数 (1)

Neo4jNeo4j

基本概念

  • 图数据库:图数据库是一类特殊的数据库,用于有效地管理图形数据模型,其中数据以节点、关系和属性的形式存储。Neo4j作为图数据库的代表,具有处理复杂关系和连接的能力。
  • 无模式:Neo4j是无模式的,这意味着它不需要在数据存储之前定义固定的数据结构。这使得Neo4j在处理动态和半结构化数据方面具有很高的灵活性。
  • neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存级数据库不同,neo4j提供了完整的数据库特性,包括ACID事物的支持,集群支持,备份与故障转移等。这使其适合于企业级生产环境下的各种应用。

主要特点

  1. 高性能:Neo4j被设计成具有高性能的图数据库,其内部存储和查询引擎被优化,以便有效地处理大规模的图形数据。
  2. 灵活性:Neo4j的图数据库模型具有很高的灵活性,可以轻松地表示和处理复杂的关系。这种灵活性使得Neo4j非常适合那些需要处理动态和多层次关系的场景。
  3. ACID支持:Neo4j提供了ACID(原子性、一致性、隔离性、持久性)的事务支持,确保数据库操作的可靠性和一致性。
  4. Cypher查询语言:Neo4j使用一种叫做Cypher的查询语言,专门用于对图数据库执行查询。Cypher语言简洁而强大,可以轻松地表达与图有关的查询和操作。
neo4j图数据库概念neo4j图数据库概念

节点

  • 节点是主要的数据元素,节点通过关系连接到其他节点,节点可以具有一个或多个属性, 节点有一个或多个标签,用于描述其在图表中的作用。

关系

  • 关系连接两个节点,关系是方向性的,关系可以有一个或多个属性。

属性

  • 属性是命名值,其中名称(或键)是字符串,属性可以被索引和约束,可以从多个属性创 建复合索引。

标签

  • 标签用于组节点到集,节点可以具有多个标签,对标签进行索引以加速在图中查找节点。

neo4j图数据库的安装

第一步:将neo4j安装信息载入到yum检索列表

代码语言:txt复制
sudo rpm --import https://debian.neo4j.com/neotechnology.gpg.key
sudo yum-config-manager --add-repo https://yum.neo4j.com/stable

第二步:使用yum install命令安装

代码语言:txt复制
yum install neo4j

第三步:修改配置文件默认在/etc/neo4j/neo4j.conf

代码语言:txt复制
dbms.directories.data=/var/lib/neo4j/data
dbms.directories.plugins=/var/lib/neo4j/plugins
dbms.directories.certificates=/var/lib/neo4j/certificates
dbms.directories.logs=/var/log/neo4j
dbms.directories.lib=/usr/share/neo4j/lib
dbms.directories.run=/var/run/neo4j


dbms.directories.import=/var/lib/neo4j/import


dbms.memory.heap.initial_size=512m 

dbms.connectors.default_listen_address=0.0.0.0

dbms.connector.http.enabled=true
dbms.connector.http.listen_address=:7474 

dbms.connector.https.enabled=true
dbms.connector.https.listen_address=:7473 

dbms.connector.bolt.enabled=true
dbms.connector.bolt.listen_address=:7687 

第四步:启动neo4j数据库

代码语言:txt复制
# 启动命令
neo4j start

其中:GPG(GNU Privacy Guard)是一种加密软件,用于加密通信和验证软件包的完整性和来源。在Linux系统中,软件包管理器(如yum或dnf)会使用GPG密钥来验证下载的软件包是否来自可信的源,并且没有被篡改。

或者可以将neo4j服务放置在supervisor控制:

代码语言:txt复制
先运行:chown -R neo4j:neo4j /var/lib/neo4j

然后去supervisord.conf中添加:

代码语言:txt复制
[program:neo4j]
command=neo4j console
user=neo4j
autostart=true
autorestart=unexpected
startsecs=30
startretries=999
priorities=90
exitcodes=0,1,2
stopsignal=SIGTERM
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=/var/log/neo4j.out
stdout_logfile_backups=10
stderr_capture_maxbytes=20MB

如果是在云服务器上,那么现在就可以使用http://(主机公网IP):7474 来访问neo4j的浏览器界面~

注意:云服务器上一定用到什么端口就去开哪个端口,否则访问不成功!

Cypher使用

create命令

创建图数据中的节点

代码语言:txt复制
CREATE (e:Employee{id:222, name:'Bob', salary:6000, deptnp:12})

match命令

匹配(查询)已有数据

代码语言:txt复制
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno

MATCH (n) return n # 查询所有结点

merge命令

若节点存在,则等效与match命令; 节点不存在,则等效于create命令。

代码语言:txt复制
MERGE (e:Employee {id:146, name:'Lucer', salary:3500, deptno:16})

使用create创建关系

必须创建有方向性的关系,否则报错。

代码语言:txt复制
CREATE (p1:Profile1)-[r:Buy]->(p2:Profile2)   # p1购买了p2

使用merge创建关系

可以创建有/无方向性的关系。

代码语言:txt复制
MERGE (p1:Profile1)-[r:miss]-(p2:Profile2)

where命令

类似于SQL中的添加查询条件。

代码语言:txt复制
MATCH (e:Employee) WHERE e.id=123 RETURN e

delete命令

删除节点/关系及其关联的属性。

代码语言:txt复制
MATCH (p1:Profile1)-[r]-(p2:Profile2) DELETE p1, r, p2

sort命令

Cypher命令中的排序使用的是order by

代码语言:txt复制
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.id

# 如果要按照降序排序,只需要将ORDER BY e.salary改写为ORDER BY e.salary DESC
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.salary DESC

在Python中使用neo4j

  • neo4j-driver是一个python中的package, 作为python中neo4j的驱动,帮助我们在python程序中更好的使用图数据库。
代码语言:txt复制
pip install neo4j-driver

连接到Neo4j数据库

需要使用驱动程序连接到Neo4j数据库。我们需要提供数据库的URI、用户名和密码。

代码语言:txt复制
from neo4j import GraphDatabase  
  
uri = "bolt://localhost:7687"  # Neo4j数据库的Bolt协议URI  
user = "neo4j"                 # 你的Neo4j用户名  
password = "your_password"     # 你的Neo4j密码  
  
driver = GraphDatabase.driver(uri, auth=(user, password))

执行Cypher查询

有了driver对象,就可以使用它来创建会话(session),并在会话中执行Cypher查询。

代码语言:txt复制
def create_person(tx, name, age):  
    tx.run("CREATE (a:Person {name: $name, age: $age})", name=name, age=age)  
  
def read_person(tx, name):  
    result = tx.run("MATCH (a:Person) WHERE a.name = $name RETURN a.name, a.age", name=name)  
    for record in result:  
        print(record["a.name"], record["a.age"])  
  
with driver.session() as session:  
    # 创建一个Person节点  
    session.write_transaction(create_person, "Alice", 30)  
      
    # 读取并打印名为Alice的Person节点的信息  
    session.read_transaction(read_person, "Alice")  
  
# 关闭驱动程序连接(可选,通常会在程序结束时自动关闭)  
driver.close()

0 人点赞