Jena Fuseki 和 Blazegraph 在字符串文字的 'type strictness' 方面表现不同

Jena Fuseki and Blazegraph behave differently with respect to 'type strictness' for string literals

我正在玩 Blazegraph (2.1.5) 和 Jena Fuseki (3.10.0)。首先,我使用以下查询插入两个三元组:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

insert data {
  <http://s> <http://untyped> 'abc' .
  <http://s> <http://typed> 'abc'^^xsd:string .
}

三元组具有具有相同字符串值的对象,但其中一个是无类型的,另一个是类型为 xsd:string

然后我执行以下查询:

select * where { ?s ?p 'abc' }

Jena Fuseki 找到了两个三元组,而 Blazegraph 只找到了 'untyped' 个。

如果我特别要求输入版本,也会发生同样的情况:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

select * where { ?s ?p 'abc'^^xsd:string }

Jena Fuseki 再次找到了两个三元组,而 Blazegraph 只找到了 'typed' 个。

行为明显不同。

这是我的问题:

  1. 什么行为(只是其中之一,或两者)符合 SparQL 1.1 规范?
  2. 如果 Jena Fuseki 的行为是唯一符合规范的行为,是否可以将 Blazegraph 配置为像 Fuseki 一样的行为?
  3. 如果 Blazegraph 的行为是 'correct',有没有办法在不使用 UNIONFILTER 的情况下找到两个三元组?

这是一个有趣的问题,因为答案并不明显。当前的三元组实现了 query and update language SPARQL 1.1, standardised in 2013. It is a query language for RDF, but for the version of RDF in place at the time, that is, RDF 1.0,于 2004 年标准化。

在 RDF 2004 中,文字可以是 plain literals or typed literals. Plain literals were a UNICODE string, with an optional language tag. Typed literals were a UNCODE string with a datatype URI

SPARQL 调用 不带语言标记的普通文字simple literals”。作为单个 UNICODE 字符串的简单文字永远不会与类型化文字相同,后者在所有情况下都是一对。所以 "some text""some text"^^xsd:string 在 RDF 2004 和 SPARQL 1.1 中是不同的文字。

现在,2014 年,新版本的 RDF,RDF 1.1, appeared where all literals have a datatype IRI, including literals with language tags. Language-tagged strings 不必在具体语法中提及其数据类型 IRI(语言标记的存在足以将数据类型 IRI 标识为 rdf:langString).用 xsd:string 键入的文字可以在具体语法中没有数据类型 IRI 的情况下编写。因此,根据 RDF 1.1,"some text" 在 Turtle 或 N-triple 语法中真正意味着 "some text"^^xsd:string

当您使用符合 RDF 1.1 的 RDF API 以及 SPARQL 1.1 实现时,会出现与您的问题相关的问题。如果加载包含以下内容的 RDF 文档:

<subject> <predicate> "some text" .

应该按照RDF 1.1规范解释,还是按照SPARQL 1.1规范加载?原则上是这样的:

INSERT DATA {
  <http://s> <http://untyped> 'abc' .
  <http://s> <http://typed> 'abc'^^xsd:string .
}

是SPARQL 1.1,所以应该理解为包含2个三元组,其中一个是简单字面量,一个是类型化字面量。但是 SPARQL 实现使用 RDF APIs,因此混合 RDF 1.1 和 SPARQL 1.1 可能会使系统应用不可预测的行为。我猜你只能依靠文档和测试来实现你的具体实现。