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' 个。
行为明显不同。
这是我的问题:
- 什么行为(只是其中之一,或两者)符合 SparQL 1.1 规范?
- 如果 Jena Fuseki 的行为是唯一符合规范的行为,是否可以将 Blazegraph 配置为像 Fuseki 一样的行为?
- 如果 Blazegraph 的行为是 'correct',有没有办法在不使用
UNION
或 FILTER
的情况下找到两个三元组?
这是一个有趣的问题,因为答案并不明显。当前的三元组实现了 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 可能会使系统应用不可预测的行为。我猜你只能依靠文档和测试来实现你的具体实现。
我正在玩 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' 个。
行为明显不同。
这是我的问题:
- 什么行为(只是其中之一,或两者)符合 SparQL 1.1 规范?
- 如果 Jena Fuseki 的行为是唯一符合规范的行为,是否可以将 Blazegraph 配置为像 Fuseki 一样的行为?
- 如果 Blazegraph 的行为是 'correct',有没有办法在不使用
UNION
或FILTER
的情况下找到两个三元组?
这是一个有趣的问题,因为答案并不明显。当前的三元组实现了 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 可能会使系统应用不可预测的行为。我猜你只能依靠文档和测试来实现你的具体实现。