图数据库neo4j desktop2.0初探
最近有一些时间,想尝试下图数据库,看图数据库如何与人工智能相关结合,提供更高质量的语料,与提示词看如何结合,这个其中的第一步。
1、首先还是安装,我这里选择了neo4j,版本为neo4j的desktop,2.0.1。
这个使用中要用power shell,操作系统版本不能太低。
下载地址是这里:
https://neo4j.ac.cn/deployment-center/?desktop-gdb
具体地址:
https://neo4j.com/artifact.php?name=neo4j-desktop-offline-2.0.1-setup.exe
新版本不太好下,我下的是2.0.1
这里下载打开后,要用迅雷下载,不然不太好下。下载好后,安装很简单,能干预的很少,就不说了。
2、打开界面后,创建一个neo4j的实例:
创建完后,就行了,注意这个密码不要忘了,当然忘了也可以重置。
3、写代码,开干。
我用的是neo4j这个扩展。
pip install neo4j -i https://mirrors.ustc.edu.cn/pypi/web/simple/
4、具体代码:
# -*- coding: utf-8 -*-
from neo4j import GraphDatabase
import os
import sys
print("开始执行...")
print(sys.stdout.encoding)# 连接参数
uri = "bolt://localhost:7687"
user = "neo4j"
password = "123123123"def create_node(driver, label, properties_list, show_progress=True):"""创建节点,如果节点已存在则不重复创建参数:driver: Neo4j驱动实例label: 节点标签properties_list: 节点属性列表show_progress: 是否显示进度信息返回:创建或找到的节点列表"""nodes = []with driver.session() as session:for properties in properties_list:# 检查节点是否已存在check_query = f"MATCH (n:{label} {{name: $name}}) RETURN n"result = session.run(check_query, name=properties['name']).single()if result is None:# 创建新节点create_query = f"CREATE (n:{label} $props) RETURN n"node = session.run(create_query, props=properties).single()nodes.append(node['n'])else:# 使用已存在的节点nodes.append(result['n'])if show_progress:print(f"节点{label}处理完成。")return nodesdef create_relationship(driver, start_node, end_node, relationship_type, show_progress=True):"""创建关系,如果关系已存在则不重复创建参数:driver: Neo4j驱动实例start_node: 起始节点end_node: 结束节点relationship_type: 关系类型show_progress: 是否显示进度信息返回:布尔值,表示操作是否成功"""if start_node and end_node:with driver.session() as session:# 检查关系是否已存在check_query = """MATCH (a {name: $start_name})-[r:%s]->(b {name: $end_name})RETURN count(r) as count""" % relationship_typeresult = session.run(check_query, start_name=start_node['name'], end_name=end_node['name']).single()if result['count'] > 0:if show_progress:print(f"关系{start_node['name']}-[:{relationship_type}]->{end_node['name']}已存在,不创建新关系。")return True# 创建新关系create_query = """MATCH (a {name: $start_name}), (b {name: $end_name})CREATE (a)-[:%s]->(b)RETURN a, b""" % relationship_typesession.run(create_query, start_name=start_node['name'], end_name=end_node['name'])if show_progress:print(f"关系{start_node['name']}和{end_node['name']}已创建。")return Trueelse:if show_progress:print(f"创建关系失败,{start_node['name'] if start_node else '节点'}或{end_node['name'] if end_node else '节点'}不存在。")return Falsedef query_relationship(driver, start_node, end_node, relationship_type):"""查询指定的关系参数:driver: Neo4j驱动实例start_node: 起始节点end_node: 结束节点relationship_type: 关系类型返回:查询结果"""if start_node and end_node:with driver.session() as session:query = """MATCH (a {name: $start_name})-[r:%s]->(b {name: $end_name})RETURN a, r, b""" % relationship_typeresults = session.run(query, start_name=start_node['name'], end_name=end_node['name'])found = Falsefor record in results:found = Trueprint(record["a"]["name"], "knows", record["b"]["name"])if not found:print(f"未找到{start_node['name']}和{end_node['name']}之间的{relationship_type}关系。")# 重新执行查询以返回结果集return session.run(query, start_name=start_node['name'], end_name=end_node['name'])# 主程序
if __name__ == "__main__":driver = Nonetry:# 连接数据库driver = GraphDatabase.driver(uri, auth=(user, password))print("成功连接到Neo4j数据库!")# 创建节点alice = create_node(driver, "Person", [{"name": "Alice"}])bob = create_node(driver, "Person", [{"name": "Bob"}])# 创建关系(测试重复创建)create_relationship(driver, alice[0], bob[0], "KNOWS")create_relationship(driver, alice[0], bob[0], "KNOWS") # 尝试重复创建,应该被检测到# 查询关系print("\n查询关系结果:")results = query_relationship(driver, alice[0], bob[0], "KNOWS")print("\n操作完成!")except Exception as e:print(f"发生错误:{e}")finally:# 确保关闭驱动连接if driver:driver.close()print("数据库连接已关闭。")
5、常用的neo4j的命令:
删除节点关系,类型为KNOWS
MATCH (a)-[r:KNOWS]->(b)
删除节点关系,类型为KNOWS
MATCH (a)-[r:KNOWS]->(b)
DELETE r
删除节点,类型为Person
MATCH (n:Person)
DELETE n
删除所有节点:
MATCH (n)
DELETE n
查询所有节点,类型为Person,返回节点的name属性,以及节点的id属性,限制返回25条记录
MATCH (n:Person) RETURN n.name, n.id LIMIT 25;
创建节点,类型为Person,属性为name和id
CREATE (n:Person {name: "张三", id: 123456})
创建关系,类型为KNOWS,关系两端的节点为n1和n2
MATCH (n1:Person {name: "张三"}), (n2:Person {name: "Bob"})
CREATE (n1)-[:KNOWS]->(n2)
删除关系,通过指定关系类型和关系id
MATCH ()-[r:KNOWS]->()
WHERE r.id = 123456
DELETE r
查看所有关系的id
MATCH ()-[r:KNOWS]-() RETURN r,elementId(r) limit 1;
通过关系的ID的查询关系
MATCH ()-[r:KNOWS]->()
WHERE elementId(r) = '5:5ed65e88-85a1-43cb-9932-77b78a4c8ec8:1157425104234217504' return r ;
通过关系的ID删除关系
MATCH ()-[r:KNOWS]->()
WHERE elementId(r) = '5:5ed65e88-85a1-43cb-9932-77b78a4c8ec8:1157425104234217504'
DELETE r
6、乱码问题:
哪里都不避开这个乱码问题。。。
win11中,执行如果乱码,一定检查控制面板中,是否启用了utf-8的支持,位置:控制面板-区域-管理-更改系统区域设置-勾选:Beta版:使用Unicode UTF-8提供全球语言支持
代码中:
第一行别忘了:
# -*- coding: utf-8 -*-
具体vscode中的扩展啥的也都不说了。。。