SPARQL 三元组中作为主题的文字

Literals as subject in SPARQL triples

就我从 SPARQL 的语法中读到的 https://www.w3.org/TR/sparql11-query/#sparqlGrammar 允许在三元组中使用文字作为主语:

[75]    TriplesSameSubject    ::=   VarOrTerm PropertyListNotEmpty | TriplesNode PropertyList
[106]   VarOrTerm     ::=   Var | GraphTerm
[109]   GraphTerm     ::=   iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | NIL

所以有可能有一个三元组,例如:

 (3, rdfs:label, 'three')

我可以在 Python 的 rdflib 中处理此类三元组,但是当我尝试在 Virtuoso 版本 06.01.3127 中使用 SERVICE 进行联合 SPARQL 查询时,Virtuoso 抱怨道。这是我在 http://localhost:8890/sparql

的本地安装中执行的错误消息
Virtuoso 37000 Error SP031: SPARQL compiler: No one quad map pattern is suitable for GRAPH _:_::default_8_4 { 3 <http://www.w3.org/2000/01/rdf-schema#label> ?s } triple at line 8

SPARQL query:
define sql:big-data-const 0 
#output-format:text/html
define sql:signal-void-variables 1 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?s WHERE {
  SERVICE <http://127.0.0.1:5000/sparql> {
    SELECT ?s WHERE {
      3 rdfs:label ?s .
    }
  }
}

这是 Virtuoso 问题还是更普遍的 SPARQL/RDF 问题,- 还是我的编程错误?

很少(我相信当前计数为零)企业级三重或四重商店处理 "Generalized RDF",这是允许在主题位置使用文字的 RDF。到目前为止,这通常被认为不能很好地扩展,尽管它在小规模上可能有用或有趣,例如 CWM,TimBL 的基于 Python 的封闭世界机器。

Virtuoso 是企业级 DBMS,处理表格 SQL 数据、图形 RDF 数据等。目前,以及计划中的未来,Virtuoso 将不会处理广义 RDF。

综上所述,应该注意的是,您是 运行 相当老的 Virtuoso,大约从 2012 年 7 月开始。无论您是 运行 Commercial or Open Source,更新到出于各种性能和功能原因,强烈建议使用更新版本(截至 2016 年 4 月至少为 7.2.4.2)。

ObDisclaimer:OpenLink Software produces Virtuoso,并雇用了我。

即使在 SPARQL 1.0 中,SPARQL 始终将文字作为语法中的主题 - 来自一个位置的变量可以在另一个位置使用,因此通过变量匹配文字作为主题无论如何都会发生。

SPARQL 1.0:
https://www.w3.org/TR/rdf-sparql-query/#sparqlTriplePatterns
SPARQL 1.1:
https://www.w3.org/TR/sparql11-query/#sparqlTriplePatterns

当然,它们不会匹配存储的 RDF。

CONSTRUCT 的规则说 "reject such triples"。

https://www.w3.org/TR/sparql11-query/#construct