基本概念
- 图数据库:图数据库是一类特殊的数据库,用于有效地管理图形数据模型,其中数据以节点、关系和属性的形式存储。Neo4j作为图数据库的代表,具有处理复杂关系和连接的能力。
- 无模式:Neo4j是无模式的,这意味着它不需要在数据存储之前定义固定的数据结构。这使得Neo4j在处理动态和半结构化数据方面具有很高的灵活性。
- neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存级数据库不同,neo4j提供了完整的数据库特性,包括ACID事物的支持,集群支持,备份与故障转移等。这使其适合于企业级生产环境下的各种应用。
主要特点
- 高性能:Neo4j被设计成具有高性能的图数据库,其内部存储和查询引擎被优化,以便有效地处理大规模的图形数据。
- 灵活性:Neo4j的图数据库模型具有很高的灵活性,可以轻松地表示和处理复杂的关系。这种灵活性使得Neo4j非常适合那些需要处理动态和多层次关系的场景。
- ACID支持:Neo4j提供了ACID(原子性、一致性、隔离性、持久性)的事务支持,确保数据库操作的可靠性和一致性。
- Cypher查询语言:Neo4j使用一种叫做Cypher的查询语言,专门用于对图数据库执行查询。Cypher语言简洁而强大,可以轻松地表达与图有关的查询和操作。
节点
- 节点是主要的数据元素,节点通过关系连接到其他节点,节点可以具有一个或多个属性, 节点有一个或多个标签,用于描述其在图表中的作用。
关系
- 关系连接两个节点,关系是方向性的,关系可以有一个或多个属性。
属性
- 属性是命名值,其中名称(或键)是字符串,属性可以被索引和约束,可以从多个属性创 建复合索引。
标签
- 标签用于组节点到集,节点可以具有多个标签,对标签进行索引以加速在图中查找节点。
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程序中更好的使用图数据库。
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查询。
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()