首页>软件资讯>常见问题

常见问题

Neo4j图数据库安装与使用

发布时间:2026-05-08 10:12:11人气:17

图数据库(Graph Database) 是一种以图结构为基础进行数据存储与查询的数据库。与传统的关系型数据库通过表格和主外键进行建模不同,图数据库使用节点(Nodes)和关系(Relationships)直接表示实体及其之间的连接,更加自然地映射现实世界中的关联结构,特别适用于处理复杂的连接型数据。


Neo4j 是目前最流行和成熟的图数据库之一,由 Neo4j 公司使用 Java 开发。它采用原生图存储与查询引擎,广泛应用于社交网络、推荐系统、知识图谱、反欺诈分析、网络安全等领域,是构建基于连接关系应用的强大平台。

简介

Neo4j 图数据产品的核心是 Neo4j 图数据库,一套帮助世界理解数据的应用程序和工具。它可以很直观地通过图元素表现数据对象之间的关系。这是一种从头开始构建的本机图数据存储,不仅能够利用数据,还能利用数据的关系。

Neo4j的安装与运行

上传neo4j和jdk的安装包到/opt目录下,并进行解压

tar -zxvf openjdk-17.0.2_linux-x64_bin.tar.gz

tar -zxvf neo4j-community-5.26.0-unix.tar.gz

/opt/jdk-17.0.2/bin/java -cp /opt/neo4j/plugins/*:/opt/neo4j/conf/*:/opt/neo4j/lib/* -Dfile.encoding=UTF-8 -Xms524288k -Xmx2097152k org.neo4j.server.CommunityEntryPoint --home-dir=/opt/neo4j --config-dir=/opt/neo4j/conf &

Neo4j图数据库.png

登录neo4j数据库
服务
地址
Web UI (Browser)
http://10.13.0.11:7474
Bolt 协议
bolt://10.13.0.11:7687


登录后大概就是下图这样子的。


登录成功.png

因为我建库了之后初始写入了一些测试数据样例,执行MATCH (n) RETURN n LIMIT 100;进行查询可以看到样例数据的图数据关系展示如下:

示例.png

可以通过图、表格、文本,代码方式展示,如果有多个节点和关系,一般会以图方式展示。

创建学校班级学生课程关系样例测试数据

// 创建学校

CREATE (s1:School {name: '第一中学', address: '北京市海淀区', foundedYear: 1950});

CREATE (s2:School {name: '第二中学', address: '上海市浦东新区', foundedYear: 1985});

1

// 创建班级

CREATE (c1:Class {name: '高三一班', grade: 3, year: 2024});

CREATE (c2:Class {name: '高三二班', grade: 3, year: 2024});

CREATE (c3:Class {name: '高二一班', grade: 2, year: 2024});

CREATE (c4:Class {name: '高一一班', grade: 1, year: 2024});

// 创建学生

CREATE (stu1:Student {name: '张三', gender: '男', age: 18, studentNo: '202401001'});

CREATE (stu2:Student {name: '李四', gender: '女', age: 18, studentNo: '202401002'});

CREATE (stu3:Student {name: '王五', gender: '男', age: 17, studentNo: '202401003'});

CREATE (stu4:Student {name: '赵六', gender: '女', age: 17, studentNo: '202401004'});

CREATE (stu5:Student {name: '钱七', gender: '男', age: 16, studentNo: '202401005'});

CREATE (stu6:Student {name: '孙八', gender: '女', age: 16, studentNo: '202401006'});

CREATE (stu7:Student {name: '周九', gender: '男', age: 15, studentNo: '202401007'});

CREATE (stu8:Student {name: '吴十', gender: '女', age: 15, studentNo: '202401008'});

// 创建课程

CREATE (co1:Course {name: '语文', credits: 4, teacher: '刘老师'});

CREATE (co2:Course {name: '数学', credits: 4, teacher: '陈老师'});

CREATE (co3:Course {name: '英语', credits: 3, teacher: '黄老师'});

CREATE (co4:Course {name: '物理', credits: 3, teacher: '杨老师'});

CREATE (co5:Course {name: '化学', credits: 3, teacher: '周老师'});

CREATE (co6:Course {name: '生物', credits: 2, teacher: '吴老师'});

CREATE (co7:Course {name: '历史', credits: 2, teacher: '郑老师'});

CREATE (co8:Course {name: '地理', credits: 2, teacher: '冯老师'});


// 建立学校-班级关系

CREATE (s1)-[:CONTAINS]->(c1);

CREATE (s1)-[:CONTAINS]->(c2);

CREATE (s1)-[:CONTAINS]->(c3);

CREATE (s2)-[:CONTAINS]->(c4);


// 建立班级-学生关系

CREATE (c1)-[:HAS_STUDENT]->(stu1);

CREATE (c1)-[:HAS_STUDENT]->(stu2);

CREATE (c1)-[:HAS_STUDENT]->(stu3);

CREATE (c1)-[:HAS_STUDENT]->(stu4);

CREATE (c2)-[:HAS_STUDENT]->(stu5);

CREATE (c2)-[:HAS_STUDENT]->(stu6);

CREATE (c3)-[:HAS_STUDENT]->(stu7);

CREATE (c4)-[:HAS_STUDENT]->(stu8);


// 建立学生-选课关系(成绩随机)

CREATE (stu1)-[:ENROLLED {semester: '2024秋季', score: 85}]->(co1);

CREATE (stu1)-[:ENROLLED {semester: '2024秋季', score: 92}]->(co2);

CREATE (stu1)-[:ENROLLED {semester: '2024秋季', score: 88}]->(co3);

CREATE (stu1)-[:ENROLLED {semester: '2024秋季', score: 90}]->(co4);

CREATE (stu2)-[:ENROLLED {semester: '2024秋季', score: 78}]->(co1);

CREATE (stu2)-[:ENROLLED {semester: '2024秋季', score: 85}]->(co2);

CREATE (stu2)-[:ENROLLED {semester: '2024秋季', score: 91}]->(co3);

CREATE (stu3)-[:ENROLLED {semester: '2024秋季', score: 82}]->(co1);

CREATE (stu3)-[:ENROLLED {semester: '2024秋季', score: 95}]->(co2);

CREATE (stu3)-[:ENROLLED {semester: '2024秋季', score: 76}]->(co4);

CREATE (stu3)-[:ENROLLED {semester: '2024秋季', score: 88}]->(co5);

CREATE (stu4)-[:ENROLLED {semester: '2024秋季', score: 90}]->(co1);

CREATE (stu4)-[:ENROLLED {semester: '2024秋季', score: 87}]->(co3);

CREATE (stu4)-[:ENROLLED {semester: '2024秋季', score: 93}]->(co6);

CREATE (stu5)-[:ENROLLED {semester: '2024秋季', score: 80}]->(co2);

CREATE (stu5)-[:ENROLLED {semester: '2024秋季', score: 85}]->(co3);

CREATE (stu5)-[:ENROLLED {semester: '2024秋季', score: 89}]->(co4);

CREATE (stu6)-[:ENROLLED {semester: '2024秋季', score: 92}]->(co1);

CREATE (stu6)-[:ENROLLED {semester: '2024秋季', score: 88}]->(co2);

CREATE (stu7)-[:ENROLLED {semester: '2024秋季', score: 84}]->(co1);

CREATE (stu7)-[:ENROLLED {semester: '2024秋季', score: 79}]->(co2);

CREATE (stu7)-[:ENROLLED {semester: '2024秋季', score: 86}]->(co3);

CREATE (stu8)-[:ENROLLED {semester: '2024秋季', score: 91}]->(co1);

CREATE (stu8)-[:ENROLLED {semester: '2024秋季', score: 88}]->(co2);

查看所有节点标签


neo4j@neo4j> CALL db.labels();

+-----------+

| label     |

+-----------+

| "Person"  |

| "Movie"   |

| "User"    |

| "School"  |

| "Class"   |

| "Student" |

| "Course"  |

+-----------+

7 rows

创建社会人员关系样例测试数据

// 可选:创建约束,保证 name 唯一(提高 MERGE 性能)

CREATE CONSTRAINT person_name_unique IF NOT EXISTS FOR (p:Social_person) REQUIRE p.name IS UNIQUE;

1

// 批量创建节点(使用 MERGE 避免重复)

MERGE (zhang:Social_person {name: '张三', age: 28, occupation: '工程师'})

MERGE (li:Social_person {name: '李四', age: 27, occupation: '设计师'})

MERGE (wang:Social_person {name: '王芳', age: 29, occupation: '产品经理'})

MERGE (zhao:Social_person {name: '赵雷', age: 30, occupation: '工程师'})

MERGE (liu:Social_person {name: '刘婷', age: 26, occupation: '教师'})

MERGE (chen:Social_person {name: '陈曦', age: 28, occupation: '医生'});


// 创建关系(使用 MERGE 避免重复关系)

MATCH (zhang:Social_person {name: '张三'})

MATCH (li:Social_person {name: '李四'})

MERGE (zhang)-[r1:FRIENDS_WITH {since: 2015, intimacy: 8}]->(li);


MATCH (zhang:Social_person {name: '张三'})

MATCH (wang:Social_person {name: '王芳'})

MERGE (zhang)-[r2:COLLEAGUE_WITH {company: '云创科技', since: 2020}]->(wang);


MATCH (li:Social_person {name: '李四'})

MATCH (wang:Social_person {name: '王芳'})

MERGE (li)-[r3:FRIENDS_WITH {since: 2018, intimacy: 7}]->(wang);


MATCH (zhao:Social_person {name: '赵雷'})

MATCH (zhang:Social_person {name: '张三'})

MERGE (zhao)-[r4:COLLEAGUE_WITH {company: '云创科技', since: 2019}]->(zhang);


MATCH (liu:Social_person {name: '刘婷'})

MATCH (chen:Social_person {name: '陈曦'})

MERGE (liu)-[r5:FRIENDS_WITH {since: 2016, intimacy: 9}]->(chen);


MATCH (liu:Social_person {name: '刘婷'})

MATCH (wang:Social_person {name: '王芳'})

MERGE (liu)-[r6:FAMILY_OF {type: '姐妹'}]->(wang);


MATCH (chen:Social_person {name: '陈曦'})

MATCH (zhao:Social_person {name: '赵雷'})

MERGE (chen)-[r7:FRIENDS_WITH {since: 2021, intimacy: 6}]->(zhao);

执行上述脚本后,你将得到一个小型社交图谱,包含 6 个人物节点和 7 条关系,覆盖了朋友、同事、家人三种常见社会关系类型。


验证写入结果

cypher

// 查看整个图谱

MATCH (n)-[r]-(m) RETURN n, r, m LIMIT 100;


// 查看某个人的朋友关系

MATCH (p:Social_person {name: '张三'})-[r:FRIENDS_WITH]-(friend) RETURN p, r, friend;

如果需要更多数据(例如增加至几十个节点),可以基于上述模式批量生成。你也可以根据自己的业务需求调整属性(如增加 gender、city 等节点属性,或给关系添加 last_met 时间戳)。

效果.png

以上是总的节点关系情况的图数据展示效果。

根据不同条件进行查询

1、查看标签为社会人员的关系

MATCH (n:Social_person) RETURN n LIMIT 25;


2、查看张三的朋友关系

MATCH (p:Social_person {name: '张三'})-[r:FRIENDS_WITH]-(friend) RETURN p, r, friend;



3、查看王芳和李四、刘婷以及张三的关系

MATCH(p:Social_person {name:'王芳'})-[r]-(related)


WHERE related.nameIN['李四','刘婷','张三']


RETURN p, r, related;


4、可以全部查询局部查看(学校班级学生课程的关系)

学校关系.png

总结

相比关系型数据库等其他数据库的数据表现,Neo4j图数据还是比较直观的查看实际事物当中的关系。Neo4j图数据库也支持将关系型数据转换成图数据关系,可以很好帮助解决社会生活中很多事情关系的直观表现。



上一条:图数据库Neo4j的图论基础与算法原理深度解析

下一条:neo4j 软件介绍