目前,MariaDB(OQGRAPH)、Oracle、Microsoft SQL Server 等关系型数据库都提供了图结构存储支持 。上图是 Oracle 中一个金融交易系统的图形数据库示例,其中 Account、Person 和 Company 是顶点,ownerOf、worksFor 和 transaction 是边;另外,name 和 number 是顶点的属性,amount 是边的属性 。它们可以使用以下数据表进行存储:
文章插图
基于这些表可以创建以下属性图形:
CREATE PROPERTY GRAPH financial_transactions VERTEX TABLES ( Accounts LABEL Account, Persons LABEL Person PROPERTIES ( name ), Companies LABEL Company PROPERTIES ( name ) ) EDGE TABLES ( Transactions SOURCE KEY ( from_account ) REFERENCES Accounts DESTINATION KEY ( to_account ) REFERENCES Accounts LABEL ( transaction ) PROPERTIES ( amount ), PersonOwnerOfAccount SOURCE Persons DESTINATION Accounts LABEL ownerOf NO PROPERTIES, CompanyOwnerOfAccount SOURCE Companies DESTINATION Accounts LABEL ownerOf NO PROPERTIES, PersonWorksForCompany SOURCE Persons DESTINATION Companies LABEL worksFor NO PROPERTIES );
接下来我们就可以直接使用 SQL 语句查询图结构,例如以下语句查找所有和名叫 Nikita 的人有过交易的人员和信息: SELECT owner.name AS account_holder, SUM(t.amount) AS total_transacted_with_Nikita FROM MATCH (p:Person) -[:ownerOf]-> (account1:Account) , MATCH (account1) -[t:transaction]- (account2) /* match both incoming and outgoing transactions */ , MATCH (account2:Account) <-[:ownerOf]- (owner:Person|Company) WHERE p.name = 'Nikita'GROUP BY owner
其中,MATCH 子句用于遍历图形结构并返回匹配的模式,语法和 Neo4j 的 Cypher 查询语言中的 MATCH 子句非常类似 。以上查询返回的结果如下:+----------------+------------------------------+| account_holder | total_transacted_with_Nikita |+----------------+------------------------------|| Camille | 1000.00 || Oracle | 4501.00 |+----------------+------------------------------+
随着 SQL 标准第 16 部分(SQL/PGQ)即将出现,我们可以在关系数据库中直接存储属性图结构数据,并且在 SQL 中进行属性图模式匹配,例如最短路径查找和最佳路径查找;SQL/PGQ 的另一个优势就是可以支持分组(GROUP BY)、聚合(AVG、SUM、COUNT 等)、排序(ORDER BY)以及许多其他的 SQL 功能 。五.SQL 与流数据处理
流数据是一组顺序、大量、快速、连续到达的数据序列,一般情况下可被视为一个随时间延续而无限增长的动态数据集合 。常见的流数据包括应用程序日志文件、网购数据、游戏玩家互动数据、社交网站信息、金融交易实时数据或地理空间服务,以及来自数据中心内所连接设备或仪器的遥测数据等 。
目前,常用的大数据流处理平台 Spark Streaming、Storm、Flink、ksqlDB 等都提供了 SQL 流数据处理功能;同时,一个关于流数据处理的 SQL 标准部分正在准备中 。
其中,ksqlDB 是一个基于 Apache Kafka 的事件流数据库,提供了轻量级的 SQL 语句,大大降低了构建流处理应用程序所需的操作复杂性 。
文章插图
客户端应用程序可以采用拉取查询(pull query)和推送查询(push query)两种方式查看和订阅数据流变化 。
推荐阅读
- iOS|iOS 16前的最后一个版本!iOS 15.5登场:一文了解详情
- 打通前后端,这款效能提升开源“神器”你一定要了解
- 一文读懂Redis的dict字典数据结构
- 新疆维吾尔自治区|一文带你了解和田玉“前世今生”
- ARM|AMD|X86/i386|AARCH64 #了解一下#操作系统:CPU架构
- 深入了解定制 Bash
- 使用Java带你打造一款简单的外卖系统
- 满族姓氏文化你了解多少
- 痛风饮食治疗注意事项
- 上海市|现在不要去上海这边打工,为什么呢?相信大家都了解