通过正则表达式查询主题或谓词

Has*_*raj 2 rdf sparql

鉴于此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>
Run Code Online (Sandbox Code Playgroud)

当我执行此SPARQL查询时

SELECT *
WHERE {
  ?s ?p ?o . 
  FILTER (regex(?o, 'Apple','i'))
}
Run Code Online (Sandbox Code Playgroud)

我得到主题和谓词:

s: http://example.org/Fadi , p: http://example.org/eat .
Run Code Online (Sandbox Code Playgroud)

但是当我执行

SELECT *
WHERE {
  ?s ?p ?o .
  FILTER (regex(?s, 'Fadi','i'))
}
Run Code Online (Sandbox Code Playgroud)

要么

SELECT *
WHERE {
  ?s ?p ?o .
  FILTER (regex(?s, 'http://example.org/Fadi','i'))
}
Run Code Online (Sandbox Code Playgroud)

我一无所获.我如何查询主题或谓词?我怎么查询startTimeendTime

Jos*_*lor 11

REGEX用于查询文本值,而不是用于匹配资源IRI.您可以使用该str函数获取资源的IRI,因此您的过滤器看起来像

FILTER (regex( str( ?s ), 'http://example.org/Fadi','i'))
Run Code Online (Sandbox Code Playgroud)

但那真的不是你想要做的.因为您正在寻找表格的三元组

<http://example.org/Fadi> ?p ?o
Run Code Online (Sandbox Code Playgroud)

用这样的查询询问他们:

SELECT *
WHERE {
  <http://example.org/Fadi> ?p ?o .
}
Run Code Online (Sandbox Code Playgroud)

您也可以在SPARQL查询中定义前缀,因此如果您使用一个名称空间中的一组术语,则可以保存一些输入,例如,

PREFIX ex: <http://example.org/>
SELECT * 
WHERE {
 ex:Fadi ?p ?o .
}
Run Code Online (Sandbox Code Playgroud)

但是,您的示例还有另一个问题.您的RDF文档没有任何XML基地,IRI的Fadi<rdf:Description rdf:about="Fadi" ...是不可预测的.例如,SPARQL引擎可能会针对文件名解析它/home/user/input.rdf/Fadi.指定XML基础,或者为rdf:about属性使用完整的IRI .假设我们添加xml:base="http://www.example.org/"rdf:RDF元素,我们可以使用Jena ARQ命令行工具运行这些查询,我们得到包含我们期望的三元组的输出,还有一些关于这些startTimeendTime属性的消息:

$ 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" |
----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这些属性值需要由元素中的rdf:Description元素指定.我不认为这xml:startTimexml:endTime是有意义的性能; 无论开始时间和结束时间是什么意思,它们应该由不同的属性指定,但这是一个建模问题,而不是语法问题.无论如何,我们可以相应地调整输入文件以获取(使用xml:basexml:(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>
Run Code Online (Sandbox Code Playgroud)

现在,当我们运行查询时,我们得到了

$ /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"    |
------------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这看起来像你想要的.更具体的查询,例如Fadi的开始和结束时间,也很容易构建.使用startTimeendTime特性,其显示到目前为止(即使它们应该被重构到不同的命名空间后),我们有:

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 .
}
Run Code Online (Sandbox Code Playgroud)

哪个产生

$ /usr/local/lib/apache-jena-2.10.0/bin/arq --data fadi.rdf --query fadi.sparql 
---------------------------
| start      | end        |
===========================
| "00:01:38" | "00:01:39" |
---------------------------
Run Code Online (Sandbox Code Playgroud)


And*_*dyS 5

?s是一个URI,正则表达式适用于字符串.使用str函数获取字符串:

FILTER (regex(str(?s), 'Fadi','i'))
Run Code Online (Sandbox Code Playgroud)