使用SPARQL在RDF中查询非XSD,RDF等数据类型

时间:2013-06-14 17:55:30

标签: rdf sparql

这是rdf代码:

 <rdf:Description rdf:about="http://id.southampton.ac.uk/building/42">
    <ns0:notation xmlns:ns0="http://www.w3.org/2004/02/skos/core#" rdf:datatype="http://id.southampton.ac.uk/ns/building-code-scheme">42</ns0:notation>
  </rdf:Description>

我需要获得号码"42"。我试过这个:

PREFIX soton: < http://id.southampton.ac.uk/ns/ >
PREFIX skos: < http://www.w3.org/2004/02/skos/core# >

?location skos:notation  rdf:datatype=<http://id.southampton.ac.uk/ns/building-code-scheme>(?note)

或类似的东西:

 ?location skos:notation soton:building-code-scheme(?note)

我知道如何使用像xsd:integer这样的实际RDF数据类型,但我不知道如何使用其他数据类型。

1 个答案:

答案 0 :(得分:3)

如果您能提供我们可以使用的完整工作数据,那么解决这些问题要容易得多。在这种情况下,将RDF片段制作成完整的RDF文档并不太难。对于这个答案,我将使用以下数据:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ns0="http://www.w3.org/2004/02/skos/core#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <rdf:Description rdf:about="http://id.southampton.ac.uk/building/42">
    <ns0:notation rdf:datatype="http://id.southampton.ac.uk/ns/building-code-scheme"
    >42</ns0:notation>
  </rdf:Description>
</rdf:RDF>

如果您尝试获取http://id.southampton.ac.uk/building/42符号的文字值,那么您可以直接使用像这样的SPARQL查询来请求它。

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?notation WHERE { 
  <http://id.southampton.ac.uk/building/42> skos:notation ?notation
}

使用Jena的ARQ命令行工具,我们得到如下输出:

$ arq --data data.rdf --query query.sparql
---------------------------------------------------------------
| notation                                                    |
===============================================================
| "42"^^<http://id.southampton.ac.uk/ns/building-code-scheme> |
---------------------------------------------------------------

如果您想获得文字的词法形式,可以使用str选择:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT (STR(?notation) as ?strNotation) WHERE { 
  <http://id.southampton.ac.uk/building/42> skos:notation ?notation
}

生成包含字符串"42"的输出:

$ arq --data data.rdf --query query.sparql
---------------
| strNotation |
===============
| "42"        |
---------------

如果您希望找到文字为skos:notation的建筑物,则需要使用SPARQL建议的2.3.3 Matching Literals with Arbitrary Datatypes中描述的语法将文字写入SPARL查询。这看起来像这样:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?building WHERE { 
  ?building skos:notation "42"^^<http://id.southampton.ac.uk/ns/building-code-scheme>
}

但是,您不必在SPARQL查询中编写完整的IRI。正如您在定义xsd:integer前缀时可以使用xsd:一样,如果您首先定义ns:building-code-scheme前缀,则可以使用ns:,如下所示。

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX ns: <http://id.southampton.ac.uk/ns/>
SELECT ?building WHERE { 
  ?building skos:notation "42"^^ns:building-code-scheme
}

两个查询都产生相同的输出:

$ arq --data data.rdf --query query.sparql
---------------------------------------------
| building                                  |
=============================================
| <http://id.southampton.ac.uk/building/42> |
---------------------------------------------