鉴于此RDF:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rdf:RDF [<!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
<!ENTITY xsd 'http://www.w3.org/2001/XMLSchema#'>]>
<rdf:RDF xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="Fadi" xml:startTime="00:01:38" xml:endTime="00:01:39">
<ns0:eat xmlns:ns0="http://example.org/">Apple</ns0:eat>
</rdf:Description>
</rdf:RDF>
执行此SPARQL查询时
SELECT *
WHERE {
?s ?p ?o .
FILTER (regex(?o, 'Apple','i'))
}
我得到主题和谓词:
s: http://example.org/Fadi , p: http://example.org/eat .
但是当我执行
时SELECT *
WHERE {
?s ?p ?o .
FILTER (regex(?s, 'Fadi','i'))
}
或
SELECT *
WHERE {
?s ?p ?o .
FILTER (regex(?s, 'http://example.org/Fadi','i'))
}
我一无所获。我如何查询主题或谓词?
如何查询startTime
和endTime
?
答案 0 :(得分:11)
REGEX
用于查询文本值,而不是用于匹配资源IRI。您可以使用str
函数获取资源的IRI,因此您的过滤器看起来像
FILTER (regex( str( ?s ), 'http://example.org/Fadi','i'))
但那真的不是你想要做的。因为您正在寻找格式的三元组
<http://example.org/Fadi> ?p ?o
通过这样的查询询问他们:
SELECT *
WHERE {
<http://example.org/Fadi> ?p ?o .
}
您也可以在SPARQL查询中定义前缀,因此如果您在一个命名空间中使用了一堆术语,则可以通过例如
来保存一些输入。PREFIX ex: <http://example.org/>
SELECT *
WHERE {
ex:Fadi ?p ?o .
}
但是,您的示例还有另一个问题。您的RDF文档没有任何XML基础,Fadi
中<rdf:Description rdf:about="Fadi" ...
的IRI是不可预测的。 SPARQL引擎可以针对文件名解析它,例如创建/home/user/input.rdf/Fadi
。指定XML基础,或使用rdf:about
属性的完整IRI。假设我们将xml:base="http://www.example.org/"
添加到rdf:RDF
元素,我们可以使用Jena ARQ命令行工具运行这些查询,我们得到包含我们期望的三元组的输出,还有一些关于{{1}的消息}}和startTime
属性:
endTime
这些属性值需要由$ arq --data fadi.rdf --query fadi.sparql
12:13:21 WARN riot :: {W118} XML attribute: xml:startTime is not known and is being discarded.
12:13:21 WARN riot :: {W118} XML attribute: xml:endTime is not known and is being discarded.
----------------------------------------------------
| s | p | o |
====================================================
| <http://www.example.org/Fadi> | ex:eat | "Apple" |
----------------------------------------------------
元素中的元素指定。我不认为rdf:Description
和xml:startTime
是有意义的属性;无论开始时间和结束时间是什么意思,它们应该由不同的属性指定,但这是一个建模问题,而不是语法问题。无论如何,我们可以相应地调整输入文件以获取(使用xml:endTime
和xml:base
元素):
xml:(start|end)Time
现在,当我们运行查询时,我们得到了
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rdf:RDF [<!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
<!ENTITY xsd 'http://www.w3.org/2001/XMLSchema#'>]>
<rdf:RDF xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xml:base="http://www.example.org/">
<rdf:Description rdf:about="Fadi">
<ns0:eat xmlns:ns0="http://example.org/">Apple</ns0:eat>
<xml:startTime>00:01:38</xml:startTime>
<xml:endTime>00:01:39</xml:endTime>
</rdf:Description>
</rdf:RDF>
这似乎是你想要的。更具体的查询,例如Fadi的开始和结束时间,也很容易构建。使用到目前为止出现的$ /usr/local/lib/apache-jena-2.10.0/bin/arq --data fadi.rdf --query fadi.sparql
------------------------------------------------------------------------------------------------
| s | p | o |
================================================================================================
| <http://www.example.org/Fadi> | <http://www.w3.org/XML/1998/namespaceendTime> | "00:01:39" |
| <http://www.example.org/Fadi> | <http://www.w3.org/XML/1998/namespacestartTime> | "00:01:38" |
| <http://www.example.org/Fadi> | ex:eat | "Apple" |
------------------------------------------------------------------------------------------------
和startTime
属性(即使它们稍后应该重构为不同的命名空间),我们有:
endTime
产生
PREFIX ex: <http://www.example.org/>
PREFIX xml: <http://www.w3.org/XML/1998/namespace>
SELECT *
WHERE {
ex:Fadi xml:startTime ?start ;
xml:endTime ?end .
}
答案 1 :(得分:5)
?s是一个URI,正则表达式适用于字符串。使用 str 函数获取字符串:
FILTER (regex(str(?s), 'Fadi','i'))