图数据库(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 &


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

可以通过图、表格、文本,代码方式展示,如果有多个节点和关系,一般会以图方式展示。
创建学校班级学生课程关系样例测试数据
// 创建学校
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 时间戳)。

以上是总的节点关系情况的图数据展示效果。
根据不同条件进行查询
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、可以全部查询局部查看(学校班级学生课程的关系)

总结
相比关系型数据库等其他数据库的数据表现,Neo4j图数据还是比较直观的查看实际事物当中的关系。Neo4j图数据库也支持将关系型数据转换成图数据关系,可以很好帮助解决社会生活中很多事情关系的直观表现。
下一条:neo4j 软件介绍
品质保证
多年的生产力软件专家
专业实力
资深技术支持项目实施团队
安全无忧
多位认证安全工程师
多元服务
软件提供方案整合,项目咨询实施
购软平台-找企业级软件,上购软平台。平台提供更齐全的软件产品、更专业的技术服务,同时提供行业资讯、软件使用教程和技巧。购软平台打造企业级数字产品综合应用服务平台。用户体验和数字类产品的专业化服务是我们不断追求的目标。购软平台您身边的企业级数字产品优秀服务商。
沪公网安备31011302006932号