By 远方时光原创,可转载,open
合作微信公众号:大数据左右手
一、概念
图数据库是一种专门用于存储和查询图形数据结构的数据库系统。图形数据结构是由节点vertices和连接节点的边缘edges组成的,这些节点和边缘可以带有各种属性。图数据库旨在有效地处理这种图形结构,使得对图形数据的查询和分析更加高效和方便。
以下是一些图数据库的关键特征和概念:
节点(Vertices): 图数据库存储数据的基本单元是节点。每个节点通常都有一个唯一的标识符,并且可以包含属性(key-value对)以描述节点的特征。
边缘(Edges): 边缘是连接两个节点的关系。边缘也可以包含属性,用于描述节点之间的关系的特征。
属性(Properties): 节点和边缘可以包含属性,这些属性用于存储有关它们自身的信息。属性可以是简单的标量值,也可以是复杂的结构。
图形查询语言: 为了方便地查询和操作图形数据,图数据库通常提供了一种图形查询语言。Cypher、SPARQL等是一些常见的图形查询语言。
事务支持: 类似于传统数据库系统,图数据库也通常提供事务支持,以确保对数据的修改是原子性、一致性、隔离性和持久性的。
索引: 为了加速查询,图数据库通常会使用索引来提高节点和边缘的检索效率。
图算法: 一些图数据库内置了一些图算法,用于在图形数据上执行各种分析和计算任务,例如最短路径、社交网络分析等。
图数据库在许多应用领域中都非常有用,特别是对于需要处理复杂关系和网络结构的场景。一些典型的应用包括社交网络分析、推荐系统、网络和IT运营管理等。Gremlin、Neo4j、Amazon Neptune、ArangoDB等是一些流行的图数据库实现。
二、为什么要用图数据
图数据库的使用主要是基于对特定类型数据的需求,其中数据以图形结构存在,涉及多个实体之间的复杂关系。以下是一些使用图数据库的主要原因:
复杂关系的存储和查询: 图数据库适用于需要存储和查询复杂关系的场景。例如,社交网络中的用户之间的关系、网络拓扑、知识图谱等,这些都可以很自然地表示为图形结构。
实时查询和分析: 图数据库对于实时查询和分析图形数据非常高效。它们提供了优化的查询引擎,可以快速导航和检索图中的节点和边缘,适用于需要即时响应的应用程序,如实时推荐系统、实时欺诈检测等。
复杂网络分析: 图数据库是处理复杂网络分析问题的理想选择。例如,在生物信息学中,图数据库可以用于分析蛋白质相互作用网络。在推荐系统中,它们可以用于分析用户之间的行为关系。
灵活的模型: 图数据库提供了灵活的数据模型,能够轻松适应数据模式的变化。与关系型数据库不同,图数据库不需要严格的预定义模式,可以动态地适应图的演化。
高度连接的数据: 对于数据之间存在大量关联和连接的场景,图数据库能够更自然地表示这种复杂性。例如,推荐系统中用户、商品和用户之间的关系,可以用图数据库更清晰地建模。
适用于半结构化数据: 图数据库通常能够有效地处理半结构化数据,因为它们不要求所有节点和边都具有相同的结构。这使得它们在处理具有不同属性和关系类型的数据时更加灵活。
内置图算法: 一些图数据库提供了内置的图算法,如最短路径、社交网络分析、图聚类等,使得在图数据上执行分析任务更加方便。
三、图数据真实案例
我工作中利用gremlin追溯复杂的发动机零部件关系
例如这个发动机零部件关系图,如果每一个子部件都有对应Id。
面对复杂的关系,二维图表很难理解部件之间的关系脉络,而图数据可以直观的知道整个关系图。
1.你可以通过搜索某一个子部件知道他隶属于哪个主部件,或者一个主部件他有哪些子部件,用于追溯关系。
2.可以利用添加边的属性(权重)并通过前端开发知道历史关系:
fcpmc->hsm 376W0100043*** (装配时间:2024/2/12 下图中虚线)
fcpmc->hsm 376W0100033*** (装配时间:2024/2/28 下图中实线)
hsm**43**是历史被装配过的,hsm**33**是最新安装的
这样复杂的历史从属关系也可以通过图数据直观理解。
四、以gremlin为例,常用命令
添加一个点以及点的属性:
g.addV('fcpm').property('id', '95xxxxxxxx').property('result_state', '1').property('component', 'fcpm').property('type_number', 'ssssssss').property('production_date', '2023-02-21 11:29:02.333000')
添加一个边以及边的属性:
边代表a--->b (b为父节点,a为子节点),可以添加属性,例如权重。
g.V('95xxxxxxx').addE('has').to(g.V('37bbbbbbbbb')).property('weight', -1673267079).property('pairing_time', '2023-01-09 12:24:39.459000')
查询下一级别节点:
g.V('376W0100****').repeat(__.in('has').simplePath()).until(inE('has').count().is(0))
查询返回json, 可利用python Api开发接口:
Out[12]: [[{'id': '376W010567276****',
'label': 'ccu',
'type': 'vertex',
'properties': {'type_number': [{'id': '29a006f3-33a1-4bd2-b55c-051f4ed5b918',
'value': '1410C01215'}],
'component': [{'id': '376W0105672****|component',
'value': 'ccu_sn'}]}},
{'id': '009747554800****',
'label': 'hsm',
'type': 'vertex',
'properties': {'result_state': [{'id': '2623b2c1-8cd3-42ac-95c9-9f1d42b818e1',
'value': '1'}],
'component': [{'id': '0097475548****|component',
'value': 'hsm_id'}],
'type_number': [{'id': '2162031a-c24b-4ffc-a150-b8744966e97d',
'value': '0097475548'}],
'production_date': [{'id': 'a516b159-f55f-4fc7-8e29-ea7c92cc35c2',
'value': '2022-12-15 20:53:25.827000'}]}}]]
常用命令链接:深入学习图语言Gremlin | 图数据库入门 - 知乎 (zhihu.com)
五、gremlin使用python Api开发
目前gremlin只主流编程语言主要支持python,还不支持spark
详情参考微软教程:快速入门:适用于 Python 的 Gremlin 库 - Azure Cosmos DB for Apache Gremlin | Microsoft Learn
六、总结
1. 由节点和边组成,节点有节点属性(节点类型,节点创建时间等等),边代表两个节点之间的从属关系(a节点->b节点),边也有边的属性(权重等等)。
2. 写入图数据就是写入节点的信息和写入边的信息。
3. 查询图数据,可以通过某一个节点,把相邻节点,甚至所有相关节点查询出来。
4.一般由Python Api开发。
5.图数据库可用于复杂关系追溯等。