当前位置: 首页 > 知识库问答 >
问题:

单quad+最基本的SPARQL查询=1结果为Jena,2结果为Sesame--谁是对的?

曾奇略
2023-03-14

只需将这一个四边形添加到空存储区:

<http://x.com/s> <http://x.com/p> 2 <http://x.com/g> .
SELECT ?g ?s ?p ?o
WHERE {
{ ?s ?p ?o }
UNION
{ GRAPH ?g { ?s ?p ?o } } }

Tomcat 6.0.37上的Jena Fuseki控制台(版本2.10.0-开箱即用,没有配置更改!)-(我理解的正确答案):

--------------------------------------------------------------
| g                | s                | p                | o |
==============================================================
| <http://x.com/g> | <http://x.com/s> | <http://x.com/p> | 2 |
--------------------------------------------------------------

Tomcat 6.0.37上的Sesame Workbench(版本2.7.3-开箱即用,没有配置更改!):只需使用Workbench中的“添加”功能,在“输入您希望上载的RDF数据”编辑框中手动添加上述四元组(在“数据格式”下拉框中选择了“N-Quad”),然后运行上述查询:

--------------------------------------------------------------
| g                | s                | p                | o |
==============================================================
|                  | <http://x.com/s> | <http://x.com/p> | 2 |
| <http://x.com/g> | <http://x.com/s> | <http://x.com/p> | 2 |
--------------------------------------------------------------

所以,对于开始研究RDF的人来说,这有点吓人--我在这里错过了什么?我假设Sesame不可能是“错误的”--所以它一定是我的“解释”(或者Bob的查询不是“标准SPARQL”,所以不同的实现可以自由返回不同的结果)--任何启示都将是非常欢迎的:)!

共有1个答案

皇甫夕
2023-03-14

正如@Joshua Taylor在他的评论中指出的,原因是Sesame和Jena使用了不同的默认图解释。

在Sesame中,整个存储库被认为是默认图:所有命名图中的所有语句,以及没有命名图的所有语句。因此,查询默认图的联合的第一个参数成功并绑定?s?p?o(但不绑定?g)。你的联合的第二个参数显然也成功了,因为原来的四元组当然是在一个命名图中,因此你得到了两个答案。

默认情况下,Jena使用“独占”默认图:默认图中只有未显式添加到任何特定命名图中的语句。因此,在Jena中,联合的第一部分失败(在Jena的默认图中没有匹配的语句),第二部分成功,因此只得到1个结果。

虽然听起来很奇怪,但两者都是正确的。不同之处在于执行查询的数据集是如何设置的。

当然,这是有办法处理的。在Jena和Sesame中,您都可以添加from(NAMED)子句,使查询的数据集是什么显式(Sesame提供Sesame:nil图名,以显式查询那些没有关联命名图的语句)。或者,可以编程方式修改执行查询的数据集定义。Jena和Sesame中的精确机制有点不同,但它们都有选项(在Sesame中,您可以在执行查询之前创建并提供DataSet对象,在Jena中,我相信您可以重新配置执行查询的实际存储或模型,使其具有不同的行为)。

 类似资料:
  • 这里有一个名为的小本体,由Protégé创建,其中我有类、、、和个体()、()和(也是)。在本体论中,我只声明。 当我在Protégé的DL Query选项卡中请求的实例时,我得到的是(它是,因此是,因此是)。 但当我编写以下SPARQ查询时: 我没有任何例子。当我将替换为时,结果是相同的。只有当我用替换它时,我才会得到所需的结果。 为什么DL查询做推断(允许我获得作为类的实例),而不是SPARQ

  • 问题内容: 谁能指出如何检查选择查询是否返回非空结果集? 例如,我有下一个查询: 我应该像下一个那样做吗: 测试结果集是否不为空? 问题答案: 使用@@ ROWCOUNT: 根据SQL Server联机丛书: 返回受最后一条语句影响的行数。如果行数超过20亿,请使用ROWCOUNT_BIG。

  • 我正在制作一个php注册脚本,注册工作正常,所有内容都已成功输入数据库,激活电子邮件工作正常,但每当我使用mysqli查询来选择或更新信息时,它都不起作用。 例如,当我使用我知道数据库中存在的帐户登录时,它告诉我用户名不存在,当单击电子邮件中的激活链接时,查询无法以相同的方式更新数据库。 我相信这是一个非常简单的错误,我忽略了我的新手,但我找了几个小时后找不到合适的答案。我真的不确定问题出在哪里。

  • 要运行查询,在工具栏中点击 运行 。如果查询语句是正确的,该查询将被运行,如果该查询应该返回数据,结果 选项卡会打开查询返回的数据。如果运行查询时发生错误,运行停止,显示相应的错误信息。 结果 选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格查看 和 表单查看。详细信息请看表查看 器。 提示:Navicat 支持返回 10 个结果集。 注意:你可以通过选择 查看 -> 显示结果 -

  • 你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navi

  • 你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器、数据库和/或模式。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格视图和表单视图。详细信息请参阅数据查看器。 【注意】Navicat