【问题标题】:SPARQL: How to combine two subjects to use in CONSTRUCT?SPARQL:如何结合两个主题在 CONSTRUCT 中使用?
【发布时间】:2016-02-26 05:00:21
【问题描述】:

我正在编写一个 SPARQL 查询,其中我正在创建一个 RDF 图。我正在使用 SPARQL 构造。作为我工作的要求,我必须连接两个主题值并将其与 CONSTRUCT 语句一起使用。我尝试过以下操作(我的 RDF 图在 Virtuoso 中):

prefix map: <#> 
prefix db: <> 
prefix vocab: <vocab/> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 
prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> 
prefix jdbc: <http://d2rq.org/terms/jdbc/>
prefix fn: <http://www.w3.org/2005/xpath-functions#> 

CONSTRUCT {
?p1 a d2rq:ClassMap
}

FROM <http://www.ndssl.bi.vt.edu/fuse>
WHERE 
{ 
<http://www.ndssl.bi.vt.edu/fuse#DataSource> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class>.
<http://www.ndssl.bi.vt.edu/fuse#OracleDataSource>  <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://www.ndssl.bi.vt.edu/fuse#DataSource>.
?DB <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   <http://www.ndssl.bi.vt.edu/fuse#OracleDataSource>.
<http://www.ndssl.bi.vt.edu/fuse#HouseholdsWithinAdminRegion> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class>.
?Table <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   <http://www.ndssl.bi.vt.edu/fuse#HouseholdsWithinAdminRegion>.
BIND(CONCAT(?DB, ?Table) AS ?p1)
}

但是,我收到以下错误:

Virtuoso RDF01 Error Bad variable value in CONSTRUCT: "http://www.ndssl.bi.vt.edu/fuse#PROTOPOPhttp://www.ndssl.bi.vt.edu/fuse#MIAMI_HOUSEHOLD_2009_1" (tag 246 box flags 0) is not a valid subject, only object of a triple can be a literal

请告诉我如何解决。

【问题讨论】:

  • CONCAT 返回一个文字(字符串)值,但在 CONSTRUCT 中用作主题。在 RDF 中,只有三元组的对象部分可能包含文字值(如该错误消息中所述)。
  • 如果一个三元组最终以某种方式非法,文字主题,bnode-predicate,处理器应该简单地跳过结果中的三元组。

标签: sparql rdf virtuoso rdfstore sparqlwrapper


【解决方案1】:

该错误基本上是说您正在连接两个 URI:

http://www.ndssl.bi.vt.edu/fuse#PROTOPOP
http://www.ndssl.bi.vt.edu/fuse#MIAMI_HOUSEHOLD_2009_1

变成文字。我不知道你到底想做什么,但你真的想连接整个 URI 还是只连接 # 之后的最后一部分?如果你想在# 之后连接你需要省略命名空间。

bind (concat(strafter(str(?s),str(fuse:)), strafter(str(?o),str(fuse:))) as ?p)

即使在这个阶段,绑定的结果也是 literal,您需要将其转换为 URI。

bind (uri(concat(strafter(str(?s),str(fuse:)), strafter(str(?o),str(fuse:)))) as ?p)

通常我会大大简化您的查询:

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix fuse: <http://www.ndssl.bi.vt.edu/fuse#>
prefix owl:<http://www.w3.org/2002/07/owl#>

CONSTRUCT {
    ?p1 a d2rq:ClassMap
}

FROM <http://www.ndssl.bi.vt.edu/fuse>
WHERE 
{ 
    fuse:DataSource a owl:Class.
    fuse:OracleDataSource  rdfs:subClassOf fuse:DataSource.
    ?DB a   fuse:DataSource.
    fuse:HouseholdsWithinAdminRegion a owl:Class.
    ?Table a  fuse:HouseholdsWithinAdminRegion.

    bind (uri(concat(strafter(str(?DB),str(fuse:)), 
        strafter(str(?Table),str(fuse:)))) as ?p)
}

【讨论】:

  • 感谢您的回复。但是它不起作用。它给了我以下错误:“Virtuoso 37000 错误 SP031:SPARQL 编译器:内部错误:未实现内置函数。”请让我知道如何解决它。
  • 查询无效:1) 之间有空格?和表 2) 变量 ?TD 未分配。
  • @user2151087:可能是您使用的 Virtuoso 版本中没有实现 STRAFTER 功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2022-08-25
  • 2018-07-20
相关资源
最近更新 更多