我在两个不同的引擎中尝试了一个SPARQL查询:


Protege 4.3-SPARQL查询选项卡
耶拿2.11.0


虽然查询相同,但是这两个工具返回的结果不同。

我尝试了如下所示的DESCRIBE查询:

DESCRIBE ?x
WHERE { ?x :someproperty "somevalue"}


protege的结果给我以?x为主体/对象的元组;而耶拿的人只接受?x作为主题。

我的问题是:


SPARQL的语法是否统一?
如果我想让DESCRIBE像以前那样工作,在耶拿该怎么办?

最佳答案

要回答第一个问题,是的,因为您在两个工具中都使用了相同的查询,所以SPARQL语法是统一的。但是,我认为您实际上要问的是,这两种工具的结果是否应该不同?即SPARQL的语义是统一的

DESCRIBE的情况下,是的,SPARQL规范明确允许结果不同,即,没有SPARQL的语义不统一,但这仅在DESCRIBE的情况下。

请参阅SPARQL规范的Section 16.4 DESCRIBE (Informative),其中指出:


查询模式用于创建结果集。 DESCRIBE形式
占用解决方案中标识的每个资源,以及
由IRI直接命名的任何资源,并组装一个RDF图
通过采取可以来自任何信息的“描述”
可用,包括目标RDF数据集。描述是
由查询服务确定


其中的重要部分是最后两句话,其描述由查询服务确定。这意味着Protege和Jena的答案都是正确的,因为可以选择它们形成描述的方式。

更改耶拿DESCRIBE处理

要回答问题的第二部分,您可以通过实现自定义DescribeHandler和关联的DescribeHandlerFactory来更改Jena处理DESCRIBE查询的方式。然后,您需要像这样注册工厂:

DescribeHandlerRegistry.get().set(new YourDescribeHandlerFactory());

10-08 13:44
查看更多