图形数据库Neo4J简介
- 格式:doc
- 大小:24.05 KB
- 文档页数:20
使用Neo4j进行组织知识图谱的构建知识图谱是一种用于表示、组织和推理知识的技术。
它通过将实体和实体之间的关系抽象成图的形式,帮助我们更好地理解和利用知识。
在构建一个组织的知识图谱时,我们可以使用Neo4j这一优秀的图数据库工具。
一、什么是Neo4jNeo4j是一种高性能的、基于图的数据库,它以图形模型存储和处理数据。
Neo4j的数据存储方式与传统的关系型数据库不同,它使用节点(Nodes)和关系(Relationships)来描述实体和实体之间的联系。
节点表示图中的实体,如人员、部门等。
每个节点可以包含一些属性,如姓名、职位等。
节点通过关系连接,并且关系可以具有方向和属性。
二、Neo4j的优势1. 灵活性:Neo4j可以灵活地表示和处理各种类型的关系,满足组织知识图谱的复杂需求。
我们可以定义不同类型的节点和关系,以及它们之间的属性,从而根据实际情况构建出适合组织的知识图谱。
2. 高性能:Neo4j基于图结构存储数据,可以高效地执行复杂的图查询和遍历操作。
这使得我们能够快速地检索和分析组织中的知识,帮助决策和问题解决。
3. 可视化:Neo4j提供了友好的图形化界面,可以直观地查看和操作知识图谱。
它还支持数据导入和导出,便于与其他工具和系统进行集成。
三、使用Neo4j构建组织知识图谱的步骤1. 定义节点和关系类型:首先,我们需要根据组织的实际情况来定义节点和关系类型。
例如,可以定义人员节点、部门节点和项目节点,以及相应的关系如所属、负责等。
2. 创建节点和关系:使用Cypher语言(Neo4j的查询语言)创建节点和关系。
例如,可以使用"CREATE"语句创建一个人员节点,然后使用"MERGE"语句创建与部门节点之间的关系。
3. 插入数据:将组织中的数据导入到Neo4j中。
可以通过批量插入、CSV文件导入等方式进行数据导入。
4. 查询和分析:使用Cypher语言可以执行各种查询和分析操作。
neo4j apoc 用法
Neo4j APOC (Awesome Procedures On Cypher) 是一个官方推荐的扩展库,提供了许多额外的Cypher过程(Procedures)和函数(Functions),极大地增强了Neo4j图数据库的功能。
APOC 允许用户执行更复杂的数据操作、图形算法、数据导入导出、流处理、以及与外部系统的集成等任务。
以下是一些APOC的基本用法示例:
其他功能:
APOC还包含了大量其他功能,比如生成随机数据、进行文本处理、日期时间操作、网络相关功能(如PageRank)、事务管理等等。
要使用APOC,首先需要确保已正确安装了对应Neo4j版本的APOC库,并在Neo4j配置中启用所使用的APOC过程。
通常,将APOC的.jar文件放置在Neo4j的plugins目录下,并重启服务后即可使用。
在Cypher查询中直接调用APOC提供的过程和函数。
vue使⽤neovis操作neo4j图形数据库及优缺点1.前⾔:由于项⽬需要在前端展⽰关系图,常规的做法是,后端操作数据库返回Json数据,前端使⽤d3或者echarts进⾏展⽰,奈何因为后端不给⼒(说是⽆法获取最核⼼的关系id),所以前端借助neovis.js插件直接操作数据库,进⾏展⽰。
2.优缺点优点:相⽐于常规做法,简单⽅便直接,⽽且neo4j数据库在处理复杂关系数据⽅⾯有优势。
缺点:暴露账号密码,通过f12控制台直接就能看到数据的账号和密码。
对此的解决⽅法是,使⽤企业版neo4j注册只读账号,或者后端直接限制数据库查询语⾔,既只让这个账号有读取⽽没有修改的权⼒。
(⽆奈啊,前端操作数据库就是不安全-.-)3.如何使⽤郑重提醒static⽂件夹放在public⽬录下,新建static⽬录导⼊的时候可以直接/static在做这个地⽅时,因为是想把他作为⼀个组件使⽤,可以吧vue⽂件注册全局组件,也可以使⽤iframe标签嵌⼊,各有优缺点。
如果是irfame嵌⼊的话,html⽂件⼀定放在public⽂件夹⾥⾯的static下,src为:/static/xxx.html(2)将dist⽬录下的neovis.js以及neovis.js.map⽂件复制出来(3)粘贴到你的vue项⽬的static⽂件夹下(4)然后在index.html⽬录下引⼊neovis.js,jquery没有引⼊的话,也需要引⼊,他会⽤到jquery(5)然后就是neovis的vue页⾯,⾥⾯⼀共四个地⽅需要修改,已经标注。
其他的直接复制就⾏<template><div class="myDiv"><div id="viz"></div>Cypher query: <textarea rows="4" cols=50 id="cypher"></textarea><br><input type="submit" value="Submit" id="reload" @click="submit"><input type="submit" value="Stabilize" id="stabilize" @click="stabilize"></div></template><script>export default {name: '',components: {},props: {},data() {return {viz: {} //定义⼀个viz对象}},mounted() { this.draw() }, //渲染methods: {submit() {var cypher = $("#cypher").val();if (cypher.length > 3) {this.viz.renderWithCypher(cypher);} else {console.log("reload");this.viz.reload();}},stabilize() {this.viz.stabilize();draw() {var config = {container_id: "viz",server_url: "后端neo4j的地址",server_user: "neo4j⽤户名,⼀般是neo4j",server_password: "neo4j密码",labels: {//"Character": "name","Character": {"caption": "name","size": "pagerank","community": "community"//"sizeCypher": "MATCH (n) WHERE id(n) = {id} MATCH (n)-[r]-() RETURN sum(r.weight) AS c"}},relationships: {"INTERACTS": {"thickness": "weight","caption": false//查询节点的语句,写成你们的initial_cypher: "match (n)-[r]->(m) return n,r,m;"};this.viz = new NeoVis.default(config);this.viz.render();console.log(this.viz);}</script><style lang="less" scoped>.myDiv {width: 800px;height: 800px;textarea {border: 1px solid lightgray;margin: 5px;border-radius: 5px;#viz {width: 100%;height: 80%;border: 1px solid #f1f3f4;font: 22pt arial;input {border: 1px solid #ccc;</style>到此这篇关于vue使⽤neovis操作neo4j图形数据库的⽂章就介绍到这了,更多相关vue neo4j图形数据库内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
neo4j cypher语法一、什么是Neo4j Cypher语法Neo4j是一种图形数据库,而Cypher是一种查询语言,用于在Neo4j数据库中查找和操作数据。
Cypher具有类似SQL的语法,但其重点在于描述图形结构和关系。
二、基本语法1. 创建节点CREATE (n:Label {property:value})其中n为节点名称,Label为标签,property为属性名称,value为属性值。
2. 创建关系MATCH (a:Label1),(b:Label2)WHERE a.property=value1 AND b.property=value2 CREATE (a)-[r:RELATIONSHIP]->(b)其中a和b分别表示两个节点的名称,Label1和Label2分别表示两个节点的标签,value1和value2分别表示两个节点的属性值,r为关系名称。
3. 查询节点MATCH (n)RETURN n.property其中n为节点名称,property为属性名称。
4. 查询关系MATCH (a)-[r]->(b)RETURN r.property其中a和b分别表示两个节点的名称,r为关系名称,property为属性名称。
5. 更新节点属性值MATCH (n:Label {property:value})SET n.new_property=new_value其中n为节点名称,Label为标签,property为原始属性名称,value 为原始属性值。
new_property和new_value分别表示新的属性名和属性值。
6. 删除节点或关系MATCH (n:Label)DETACH DELETE n其中n为要删除的节点名称,并且该节点没有任何关联关系。
如果要删除关系,可以使用以下语法:MATCH (a)-[r:RELATIONSHIP]->(b)DELETE r其中a和b分别表示两个节点的名称,r为关系名称。
neo4j概念Neo4j是一种流行的图形数据库管理系统,用于存储、检索和管理大规模图形数据。
以下是与Neo4j相关的一些基本概念:1. 节点(Nodes):•节点是图形数据库中的基本数据单元。
•节点通常代表实体,如人、地点、事物等。
•每个节点可以包含属性,用于存储关于该节点的信息。
2. 关系(Relationships):•关系用于连接不同的节点,表示节点之间的关联关系。
•关系通常具有类型和方向,并可以包含属性,用于描述关系的特性。
3. 属性(Properties):•节点和关系可以包含属性,这些属性是键值对,用于存储与节点或关系相关的附加信息。
•属性可以是文本、数字、日期等不同数据类型。
4. 标签(Labels):•标签是用于对节点进行分类或分组的机制。
•节点可以具有一个或多个标签,以便更轻松地查询和操作相关节点。
5. 图(Graphs):•图是由节点、关系和属性组成的数据结构,用于表示实际世界中的复杂关系网络。
• Neo4j数据库存储和管理图数据,允许进行高效的图形查询和分析。
6. Cypher查询语言:• Cypher是Neo4j的查询语言,用于执行图形数据库中的查询和操作。
• Cypher使用类似SQL的语法,但专门设计用于处理图形数据的查询需求。
7. 索引(Indexes):• Neo4j支持创建索引以提高数据检索性能。
•索引可以根据属性值加快节点或关系的查找速度。
8. 事务(Transactions):• Neo4j支持事务,确保数据库操作的原子性和一致性。
•事务用于保护数据免受损坏或不一致的影响。
9. 扩展性和性能:• Neo4j具有良好的扩展性,能够处理大规模图形数据。
•它的性能优化和查询引擎可以有效处理复杂的图形查询。
10. 社区和企业版本:• Neo4j有一个开源的社区版本和一个商业的企业版本,具有更多的高级功能和支持选项。
Neo4j是一种强大的工具,特别适用于需要处理复杂关系数据的应用,如社交网络分析、推荐系统、知识图谱等领域。
目录前言I. 简介1. Neo4j的亮点2. 图数据库概要3. Neo4j图数据库II. 教程4. 在Java应用中使用Neo4j5. Neo4j远程客户端库6. 遍历查询框架7. 数据模型范例8. 多语言支持9. 在Python应用中使用Neo4j10. 扩展Neo4j服务器III. 参考11. 性能12. 事务管理13. 数据导入14. 索引15. Cypher查询语言16. 图形算法17. Neo4j服务器18. REST API19. 在Python中使用Neo4j嵌入模式IV. 操作20. 安装和部署21. 配置和调优22. 高可用性模式23. 备份24. 安全25. 监视服务器V. 工具集26. 基于Web的Neo4j图数据库管理工具27. Neo4j命令行VI. 社区28. 社区支持29. 促进Neo4j发展A. 联机帮助页A.1. neo4jA.2. neo4j-shellA.3. neo4j-backupA.4. neo4j-coordinatorA.5. neo4j-coordinator-shellB. 常见问题第 1 章Neo4j的亮点作为一款强健的,可伸缩的高性能数据库,Neo4j最适合完整的企业部署或者用于一个轻量级项目中完整服务器的一个子集存在。
它包括如下几个显著特点:完整的ACID支持高可用性轻易扩展到上亿级别的节点和关系通过遍历工具高速检索数据适当的ACID操作是保证数据一致性的基础。
Neo4j确保了在一个事务里面的多个操作同时发生,保证数据一致性。
不管是采用嵌入模式还是多服务器集群部署,都支持这一特性。
更多详细的介绍,请参考章节:transactions。
可靠的图型存储可以非常轻松的集成到任何一个应用中。
随着我们开发的应用在运营中不断发展,性能问题肯定会逐步凸显出来,而Neo4j不管应用如何变化,他只会受到计算机硬件性能的影响,不受业务本身的约束。
部署一个neo4j服务器便可以承载上亿级的节点和关系。
neo4j基本语法Neo4j是一种高性能的图数据库,具有强大的查询语言和操作语法。
本文将介绍Neo4j的基本语法,包括创建节点和关系、查询数据和使用函数等方面的内容。
一、创建节点和关系在Neo4j中,可以使用CREATE语句来创建节点和关系。
节点可以有一个或多个标签,使用冒号(:)后跟标签名称的方式进行标记。
关系可以有一个或多个类型,使用方括号[]中的关系类型进行标记。
以下是创建节点和关系的示例:1. 创建单个节点:CREATE (:Person {name: 'Alice', age: 30})2. 创建带有多个标签的节点:CREATE (:Person:Employee {name: 'Bob', age: 35})3. 创建关系:MATCH (p1:Person), (p2:Person)WHERE = 'Alice' AND = 'Bob'CREATE (p1)-[:FRIEND]->(p2)二、查询数据在Neo4j中,可以使用MATCH语句来查询数据。
MATCH语句用于指定要查询的模式,并使用WHERE子句来添加条件。
以下是查询数据的示例:1. 查询所有节点:MATCH (n) RETURN n2. 查询特定标签的节点:MATCH (p:Person) RETURN p3. 查询关系:MATCH (p1)-[r:FRIEND]->(p2)WHERE = 'Alice'RETURN p1, r, p2三、使用函数Neo4j提供了丰富的内置函数,用于对数据进行处理和计算。
以下是一些常用的函数:1. 字符串函数:- toUpper():将字符串转换为大写- toLower():将字符串转换为小写- substring():获取字符串的子串2. 数值函数:- abs():返回数值的绝对值- round():对数值进行四舍五入- floor():返回小于或等于指定数值的最大整数3. 时间函数:- date():返回当前日期- datetime():返回当前日期和时间- duration():返回时间间隔的持续时间四、索引和约束在Neo4j中,可以使用索引和约束来提高查询性能和数据完整性。
Neo4j数据库设计规范Neo4j是一种图形数据库系统,它的设计和使用需要遵循一些规范,以确保数据的有效性和一致性。
本文档将提供一些Neo4j数据库设计的准则和最佳实践。
数据模型设计1. 定义清晰的节点标签(Labels):合理定义节点的标签,标签应该代表节点所代表的实体或概念。
标签的命名应具有描述性和一致性,以便更好地理解和查询数据。
定义清晰的节点标签(Labels):合理定义节点的标签,标签应该代表节点所代表的实体或概念。
标签的命名应具有描述性和一致性,以便更好地理解和查询数据。
2. 属性设计:在设计节点属性时,应该考虑到属性的类型,避免冗余数据和重复的属性命名。
同时,属性的数据类型应该和节点的实际含义相匹配。
属性设计:在设计节点属性时,应该考虑到属性的类型,避免冗余数据和重复的属性命名。
同时,属性的数据类型应该和节点的实际含义相匹配。
3. 关系设计:合理定义节点之间的关系。
关系可以通过单一的类型或多个类型来表示,具体取决于需要。
关系类型的命名应该清晰、简明,并准确地描述节点之间的连接关系。
关系设计:合理定义节点之间的关系。
关系可以通过单一的类型或多个类型来表示,具体取决于需要。
关系类型的命名应该清晰、简明,并准确地描述节点之间的连接关系。
4. 避免过度索引:过度使用索引可能会影响性能。
只对需要频繁查询的属性创建索引,并根据实际情况进行索引的优化。
避免过度索引:过度使用索引可能会影响性能。
只对需要频繁查询的属性创建索引,并根据实际情况进行索引的优化。
查询性能优化1. 使用适当的索引:根据实际查询需求,对频繁查询的属性创建合适的索引,以提高查询性能。
使用适当的索引:根据实际查询需求,对频繁查询的属性创建合适的索引,以提高查询性能。
2. 利用图形查询语言(Cypher):Cypher是Neo4j查询语言,它可以以图的方式查询节点和关系。
熟悉并正确使用Cypher语法可以提高查询的效率和准确性。
利用图形查询语言(Cypher):Cypher是Neo4j查询语言,它可以以图的方式查询节点和关系。
neo4j数据库设计总结Neo4j数据库设计总结Neo4j是一款开源的图形数据库管理系统,具有高效、可拓展、可靠以及易于使用等特点。
在实际应用中,数据库设计是非常重要的一步,直接关系到数据的存储、查询和管理效率。
因此,本文将对Neo4j数据库设计进行总结。
一、实体和关系设计在Neo4j数据库设计中,实体和关系设计是最基础的一步。
实体和关系的设计直接影响了数据库的性能和查询效率。
在设计实体时,应该根据实际情况进行分类,避免出现冗余数据和重复关系。
在设计关系时,应该考虑关系的方向性和权重,以便更好地进行查询和分析。
二、索引和约束设计索引和约束设计是保证数据库数据完整性和查询效率的重要因素。
在设计索引时,应该根据实际查询需求进行选择,避免过多的索引影响数据库性能。
在设计约束时,应该根据实际情况进行选择,避免出现数据不一致和错误的情况。
三、性能优化设计性能优化设计是保证数据库高效运行的重要因素。
在设计时,应该考虑数据的存储、查询和管理效率。
可以采用分区、缓存、集群等方式进行性能优化。
四、数据备份和恢复设计数据备份和恢复设计是保证数据库安全和可靠性的重要因素。
在设计时,应该考虑数据备份和恢复的频率和方式,以便在出现意外情况时能够快速恢复数据。
五、安全设计安全设计是保证数据库数据安全和可靠性的重要因素。
在设计时,应该考虑数据的访问权限和安全性,采用加密、身份验证等方式进行安全控制。
六、灾备设计灾备设计是保证数据库在灾难情况下能够快速恢复运行的重要因素。
在设计时,应该考虑数据备份和恢复的方式,采用冗余、负载均衡等方式进行灾备控制。
在Neo4j数据库设计中,应该根据实际情况进行分类和选择,避免冗余数据和重复关系。
同时,应该考虑数据库的性能、安全和可靠性,采用适当的方式进行设计和优化。
neo4j unwind用法Neo4j是一个高性能、可扩展的图数据库,它使用图形结构来管理和表示数据。
在Neo4j中,unwind是一个非常有用的操作,它允许我们将一个集合中的元素逐个拆分,使它们成为一个新的行。
在本文中,我们将探讨unwind的用法,并通过实际示例来说明如何在Neo4j中使用它。
什么是unwind?在Neo4j中,unwind是一个用于将集合中的元素分解为一个新行的操作符。
unwind常常与其他查询操作符(例如match、create、return等)一起使用,以便可以逐个处理集合中的元素。
unwind操作符可以接收一个集合参数,并根据集合中的每个元素生成新的行。
这对于在查询过程中处理大量元素的情况非常有用。
unwind的语法unwind操作符在Cypher查询语言中使用。
下面是unwind操作符的基本语法:UNWIND expression AS variable在这里,expression是一个集合,它可以是一个Cypher表达式或返回一个集合的函数。
variable是一个在查询中引用生成的新行的变量。
unwind的示例为了更好地理解unwind的用法,让我们通过一个具体的示例来说明。
假设我们有一个图数据库,其中包含了一些用户和他们的朋友关系。
每个用户节点都有一个名为name的属性,而朋友关系通过一个名为FRIEND_OF的关系来表示。
现在,我们想要找到每个用户的朋友数量,并按照降序对结果进行排序。
首先,我们需要使用match操作符来检索所有用户和他们的朋友关系。
然后,我们可以使用unwind操作符来逐个处理每个用户的朋友关系。
以下是一个示例查询:MATCH (user:User)-[:FRIEND_OF]->(friend)WITH user, count(friend) AS friendCountORDER BY friendCount DESCRETURN AS userName, friendCount在这个查询中,我们使用match操作符检索了用户和他们的朋友关系。
图形数据库Neo4J简介最近我在用图形数据库来完成对一个初创项目的支持。
在使用过程中觉得这种图形数据库实际上挺有意思的。
因此在这里给大家做一个简单的介绍。
NoSQL数据库相信大家都听说过。
它们常常可以用来处理传统的关系型数据库所难以解决的一系列问题。
通常情况下,这些NoSQL数据库分为Graph,Document,Column Family以及Key-Value Store等四种。
这四种类型的数据库分别使用了不同的数据结构来记录数据。
因此它们所适用的场景也不尽相同。
其中最为特别的便是图形数据库了。
可以说,它和其它的一系列NoSQL数据库非常不同:丰富的关系表示,完整的事务支持,却没有一个纯正的横向扩展解决方案。
在本文中,我们就将对业界非常流行的图形数据库Neo4J进行简单的介绍。
图形数据库简介相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题。
例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与。
通常情况下这些人员常常都被抽象为Person类型,对应着同一个数据库表。
同时一位导演本身也可以是其它电影或者电视剧的演员,更可能是歌手,甚至是某些影视公司的投资者(没错,我这个例子的确是以赵薇为模板的)。
而这些影视公司则常常是一系列电影,电视剧的资方。
这种彼此关联的关系常常会非常复杂,而且在两个实体之间常常同时存在着多个不同的关系:在尝试使用关系型数据库对这些关系进行建模时,我们首先需要建立表示各种实体的一系列表:表示人的表,表示电影的表,表示电视剧的表,表示影视公司的表等等。
这些表常常需要通过一系列关联表将它们关联起来:通过这些关联表来记录一个人到底参演过哪些电影,参演过哪些电视剧,唱过哪些歌,同时又是哪些公司的投资方。
同时我们还需要创建一系列关联表来记录一部电影中哪些人是主角,哪些人是配角,哪个人是导演,哪些人是特效等。
可以看到,我们需要大量的关联表来记录这一系列复杂的关系。
在更多实体引入之后,我们将需要越来越多的关联表,从而使得基于关系型数据库的解决方案繁琐易错。
这一切的症结主要在于关系型数据库是以为实体建模这一基础理念设计的。
该设计理念并没有提供对这些实体间关系的直接支持。
在需要描述这些实体之间的关系时,我们常常需要创建一个关联表以记录这些数据之间的关联关系,而且这些关联表常常不用来记录除外键之外的其它数据。
也就是说,这些关联表也仅仅是通过关系型数据库所已有的功能来模拟实体之间的关系。
这种模拟导致了两个非常糟糕的结果:数据库需要通过关联表间接地维护实体间的关系,导致数据库的执行效能低下;同时关联表的数量急剧上升。
这种执行效能到底低下到什么程度呢?就以建立人和电影之间的投资关系为例。
一个使用关联表的设计常常如下所示:如果现在我们想要通过该关系找到一部电影的所有投资人,关系型数据库常常会执行哪些操作呢?首先,在关联表中执行一个Table Scan操作(假设没有得到索引支持),以找到所有film域的值与目标电影id相匹配的记录。
接下来,通过这些记录中的person域所记录的Person的主键值来从Person表中找到相应的记录。
如果记录较少,那么这步就会使用Clustered Index Seek操作(假设是使用该运算符)。
整个操作的时间复杂度将变为O(nlogn):可以看到,通过关联表组织的关系在运行时的性能并不是很好。
如果我们所需要操作的数据集包含了非常多的关系,而且主要是在对这些关系进行操作,那么可以想象到关系数据库的性能将变得有多差。
除了性能之外,关联表数量的管理也是一个非常让人头疼的问题。
刚刚我们仅仅是举了一个具有四个实体的例子:人,电影,电视剧,影视公司。
现实生活中的例子可不是这么简单。
在一些场景下,我们常常需要对更多的实体进行建模,从而完整地描述某一领域内的关联关系。
这种关联关系所涵盖的可能包含影视公司的控股关系,各控股公司之间复杂的持股关系以及各公司之间的借贷款情况及担保关系等,更可能是人之间的关系,人与各个品牌之间的代言关系,各个品牌与所属公司之间的关系等。
可以看到,在需要描述大量关系时,传统的关系型数据库已经不堪重负。
它所能承担的是较多实体但是实体间关系略显简单的情况。
而对于这种实体间关系非常复杂,常常需要在关系之中记录数据,而且大部分对数据的操作都与关系有关的情况,原生支持了关系的图形数据库才是正确的选择。
它不仅仅可以为我们带来运行性能的提升,更可以大大提高系统开发效率,减少维护成本。
在一个图形数据库中,数据库的最主要组成主要有两种,结点集和连接结点的关系。
结点集就是图中一系列结点的集合,比较接近于关系数据库中所最常使用的表。
而关系则是图形数据库所特有的组成。
因此对于一个习惯于使用关系型数据库开发的人而言,如何正确地理解关系则是正确使用图形数据库的关键。
注:这里的结点集是我自己的翻译。
在Neo4J官方文档中,其被称为label。
原文为:A label is a named graph construct that is used to group nodes into sets; all nodes labeled with the same label belongs to the same set。
我个人觉得生硬地取名为标签反而容易让别人混淆,所以选取了“group nodes into sets”的意译,也好让label和node,即结点集和结点之间的关系能够更好地对应。
但是不用担心,在了解了图形数据库对数据进行抽象的方式之后,您就会觉得这些数据抽象方式实际上和关系型数据库还是非常接近的。
简单地说,每个结点仍具有标示自己所属实体类型的标签,也既是其所属的结点集,并记录一系列描述该结点特性的属性。
除此之外,我们还可以通过关系来连接各个结点。
因此各个结点集的抽象实际上与关系型数据库中的各个表的抽象还是有些类似的:但是在表示关系的时候,关系型数据库和图形数据库就有很大的不同了:从上图中可以看到,在需要表示多对多关系时,我们常常需要创建一个关联表来记录不同实体的多对多关系,而且这些关联表常常不用来记录信息。
如果两个实体之间拥有多种关系,那么我们就需要在它们之间创建多个关联表。
而在一个图形数据库中,我们只需要标明两者之间存在着不同的关系,例如用DirectBy关系指向电影的导演,或用ActBy 关系来指定参与电影拍摄的各个演员。
同时在ActBy关系中,我们更可以通过关系中的属性来表示其是否是该电影的主演。
而且从上面所展示的关系的名称上可以看出,关系是有向的。
如果希望在两个结点集间建立双向关系,我们就需要为每个方向定义一个关系。
也就是说,相对于关系数据库中的各种关联表,图形数据库中的关系可以通过关系能够包含属性这一功能来提供更为丰富的关系展现方式。
因此相较于关系型数据库,图形数据库的用户在对事物进行抽象时将拥有一个额外的武器,那就是丰富的关系:因此在为图形数据库定义数据展现时,我们应该以一种更为自然的方式来对这些需要展现的事物进行抽象:首先为这些事物定义其所对应的结点集,并定义该结点集所具有的各个属性。
接下来辨识出它们之间的关系并创建这些关系的相应抽象。
因此一个图形数据库中所承载的数据最终将有类似于下图所示的结构:设计一个优质的图在了解了图形数据库的基础知识之后,我们就要开始尝试使用图形数据库了。
首先我们要搞清楚一个问题,那就是如何为我们的图形数据库定义一个设计良好的图?实际上这并不困难,您只需要了解图数据库设计时所使用的一系列要点即可。
首先就是,分清图中结点集,结点以及关系之间的相互联系。
在以往的基于关系型数据库的设计中,我们常常会使用一个表来抽象一类事物。
如对于人这个概念,我们常常会抽象出一个表,并在表中添加表示两个人的记录,Alice和Bob:而在图数据库中,这里对应着两个概念:结点集和结点。
在通常情况下,图形数据库中的数据展示并不使用结点集,而是独立的结点:而如果需要在图中添加对书籍的支持,那么这些书籍将仍然被表示为一个结点:也就是说,虽然在一个图数据库中常常拥有结点集的概念,但是它已经不再作为图数据库的最重要抽象方式了。
甚至从某些图形数据库已经允许软件开发人员使用Schemaless结点这一点上来看,它们已经将结点集的概念弱化了。
反过来,我们思考的角度就应该是结点个体,以及这些个体之间所存在的一系列关系。
那么我们是不是可以随便定义各个结点所具有的数据呢?不是的。
这里最为常用的一个准则就是:Schemaless这种灵活度能为你带来好处。
例如相较于强类型语言,弱类型语言可以为软件开发人员带来更大的开发灵活度,但是其维护性和严谨性常常不如强类型语言。
同样地,在使用Schemaless结点时也要兼顾灵活性和维护性。
这样我们就可以在结点中添加多种多样的关系,而不用像在关系型数据库中那样需要担心是否需要通过更改数据库的Schema来记录一些外键。
这进而允许软件开发人员在各结点间添加多种多样的关系:因此在一个图形数据库中,结点集这个概念已经不是最重要的那一类概念了。
例如在某些图形数据库中,各个结点的ID并不是按照结点集来组织的,而是根据结点的创建顺序来赋予的。
在调试时您可能会发现,某个结点集内的第一个结点的ID是1,第二个结点的ID就是3了。
而具有2这个ID 的结点则处于另一个结点集中。
那么我们应该如何为业务逻辑定义一个合适的图呢?简单地说,单一事物应该被抽象为一个结点,而同一类型的结点被记录在同一个结点集中。
结点集内各结点所包含的数据可能有一些不同,如一个人可能有不同的职责并由此通过不同的关系和其它结点关联。
例如一个人既可能是演员,可能是导演,也可能是演员兼导演。
在关系型数据库中,我们可能需要为演员和导演建立不同的表。
而在图形数据库中,这三种类型的人都是人这个结点集内的数据,而不同的仅仅是它们通过不同的关系连接到不同的结点上了而已。
也就是说,在图形数据库中,结点集并不会像关系型数据库中的表一样粒度那么小。
一旦抽象出了各个结点集,我们就需要找出这些结点之间所可能拥有的关系。
这些关系不仅仅是跨结点集的。
有时候,这些关系是同一结点集内的结点之间的关系,甚至是同一结点指向自身的关系:这些关系通常都具有一个起点和终点。
也就是说,图形数据库中的关系常常是有向的。
如果希望在两个结点之间创建一个相互关系,如Alice和Bob彼此相识,我们就需要在他们之间创建两个KNOW_ABOUT关系。
其中一个关系由Alice指向Bob,而另一个关系则由Bob指向Alice:需要注意的一点就是,虽然说图形数据库中的关系是单向的,但是在一些图形数据库的实现中,如Neo4J,我们不仅仅可以查找到从某个结点所发出的关系,也可以找到指向某个结点的各个关系。