GraphQL和SPARQL有什么区别?

34

我目前正在对语义Web和表示个人和组织之间关系的复杂数据模型进行大量研究。

我了解一些语义本体,但从未真正理解它的用途,除非是制作图表。

我在大学维基上看到问题本体的语言是SPARQL(如果我错了请告诉我)。

但最近我看到一家公司创造了一个语义本体,并将其以GraphQL的形式呈现出来,这是我不知道的(https://diffuseur.datatourisme.gouv.fr/graphql/voyager/)。

我认为语义本体是为了更好地查找信息,例如制作聊天机器人(这是我想做的),但这里他们将语义本体转换为API,这样可以吗?要制作GraphQL,我是否应该首先构建语义本体?

您能向我解释一下其中的区别吗?老实说,这对我来说有点模糊。


顺便说一下,链接现在无法使用。你知道实际的链接吗? - Stanislav Kralin
你好,你可以尝试访问:https://framagit.org/datatourisme/ontology/tree/master - Erwan Pesle
4个回答

42

背景

Datatourisme 是一个平台,可以通过Producteur组件发布和通过Diffuseur组件消费与POI相关的开放数据。

看起来你已经链接到了使用GraphQL Voyager开发的特定应用程序,该应用程序展示了由Diffuseur公开的GraphQL API的功能。

API文档在此处提供(法语):

问题

  • Datatourisme使用RDF格式存储数据(可能使用Blazegraph三元组存储)。
  • Datatourisme通过GraphQL提供访问(而不是SPARQL)。

RDF的原因

  • 部分原因是由于某些“无模式”,RDF在异构数据集成任务中很方便:

    旅游国家本体结构以共同的共享格式,从不同的官方法国数据库中提取的整个旅游数据:娱乐和事件、自然和文化遗址、休闲和体育活动、旅游产品、旅游、住宿、商店、餐厅。

  • RDF是语义的:特别是,RDF是自描述的。

SPARQL

  • SPARQL是用于RDF查询的W3C标准化语言。还提出了其他RDF查询语言。

    顺便说一下,可以使用SPARQL查询非RDF源,例如定义R2RML映射。

  • RDF的自我描述和SPARQL的标准性消除了每天创建或学习新(糟糕)API的需要。

GraphQL

  • 与SPARQL类似,GraphQL允许避免多次请求。

  • GraphQL允许包装不同种类的不同数据源,但通常它们是REST API。

    正如您所看到的,可以可能包装SPARQL端点(还存在HyperGraphQL)。

为什么选择GraphQL

Datatourisme为什么更喜欢GraphQL?

  • GraphQL更接近开发人员和他们广泛使用的技术。过去,JSON-LD也有相同的动机(但请参见我关于JSON-LD 此处的注释)。

  • 看起来,Diffuseur的GraphQL层提供API密钥支持并防止过于复杂的SPARQL查询。

数据是否仍然语义化

  • 答案取决于您所说的“语义”是什么意思。有一种观点认为,即使是关系模型也相当具有语义...

  • 如果可以通过GraphQL提取:rcs属性的注释(而答案似乎是否定的),我会肯定地回答。

结论

回答您的直接问题:

  • 不需要(虽然可能)首先创建一个语义本体来使用GraphQL;
  • 在创建语义本体后不需要(虽然可能)使用GraphQL。

回答您的间接问题:

  • 可能需要语义本体才能构建这样的聊天机器人;
  • 可能还需要额外的东西。

另请参见:Siri中的知识是如何表示的 - 是本体论还是其他什么?

更新

除了HyperGraphQL之外,还有其他有趣的融合项目:


2
谢谢你给出的令人印象深刻的答案,Stanislav。我的目标是帮助市民参与到城市的日常生活中,这就是为什么我考虑建立一个本体论来描述城市的生态系统(个人 - 组织),并且为了界面设计,我想建立一个聊天机器人,一种人工智能。你有什么建议吗? - Erwan Pesle
@ErwanPesle,不幸的是,我对这个主题不熟悉......我希望T. Gruber的采访能有所帮助。 - Stanislav Kralin
1
请更新链接至https://www.hypergraphql.org/。Stackoverflow不允许我编辑少于6个字符的内容。 - Devendra Parhate

12
GraphQL和SPARQL是不同的语言,用于不同的目的。 SPARQL是一种用于处理三元存储、图形数据集和RDF节点的语言。GraphQL是一种API语言,最好用于处理JSON结构。至于您的具体情况,我建议您明确在应用程序中使用人工智能的目标。如果您需要在应用程序中应用图形数据集,执行更高级的知识发现(例如对数据集进行推理),则可能需要采用语义Web方法,在数据集之上应用SPARQL。正如下图所示,语义Web呈现不同的层以执行知识发现,通过本体设计和RDF化数据集进行推理。

diagram

点击这里阅读更多。 如果你的AI应用程序没有这样的要求,并且可以使用基于JSON的数据库完成数据分析,那么GraphQL可能是创建API的不错选择,因为它被不同的Web和移动应用程序广泛使用。特别是,它用于通过不同平台和微服务共享数据。点击这里获取更多信息。

GraphQL diagram


谢谢您, 对于一个聊天机器人,您会使用哪种技术? - Erwan Pesle
在第一张图片中,为什么RDF位于XML之上?这是否表明RDF在某种程度上需要XML,不能在没有XML的情况下使用? - jaco0646
1
@ErwanPesle 我在不同的项目中使用这两种技术。我主要使用语义网络来进行深入研究。例如,当我想要在图形数据库上回答复杂的查询时。另一方面,在公司中,我使用graphql来构建基于关系型数据库的API,而不是使用REST API。 - Enayat
1
@jaco0646 XML主要是一种序列化格式,而RDF主要是一种数据模型。换句话说,我们用XML格式表示数据,而RDF是数据结构的更高级和通用方面(例如,每个对象可以定义为SUBJECT、OBJECT和PREDICATE)。因此,RDF三元组可以用不同的格式表示,如turtle、XML等。希望我能解释清楚!请在这里阅读https://www.cambridgesemantics.com/blog/semantic-university/learn-rdf/rdf-vs-xml/。 - Enayat
1
所以在这张图片中,XML只是一个例子吗?它可以说成“语法:JSON-LD”并且具有相同的意思吗? - jaco0646
3
@jaco0646 是的,可能是这样。这张照片是从第一个软件架构中拍摄的。随着时间的推移,越来越多的数据表示被添加到了该架构中。 - Enayat

7

简单来说,它们的区别在于:

  • SPARQL (SPARQL Protocol and RDF Query Language) 是一种专门用于查询RDF图数据库(CRUD等)的语言。它是语义Web工具中的标准,并由W3C推荐。

  • GraphQL 是由Facebook创建的一种类似于JSON的语言,用于与API进行通信。它是客户端和服务器端点之间的通信工具。请求本身定义了响应的结构。它的使用不限于SQL或NoSQL等... "Graph"并不意味着像RDF那样由三元组构成的结构。

这是两种针对不同应用的不同语言。


2
你好, 感谢您的回答。那么,我应该使用SPARQL还是GraphQL来构建我的人工智能呢? 为什么这家公司先做本体论然后再做GraphQL呢?他们是否使用本体论来构建数据模型的逻辑,然后使用GraphQL更快地查询它?谢谢 - Erwan Pesle

5

之前的答案中没有提到的一个很重要的区别是,虽然SPARQL在一般情况下是更强大的查询语言,但它只能产生表格输出;而GraphQL则提供树形结构,这在某些实现情况下非常重要。


1
感谢@Ivo提到它,这里是一个实现案例,我需要获取一棵树形结构,我希望在尝试使用Sparql之前知道这一点。链接 - Bilal
13
SPARQL的CONSTRUCT请求会产生一个输出图形。 - loic.jaouen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接