检索具有相同RDF/XML元素名称而不使用ID的所有资源

本文关键字:资源 ID RDF 元素 XML 检索 | 更新日期: 2023-09-27 18:01:16

打印我所有图Triples的主题,我看到我的数据中的主题始终是形式为GraphURI/#SubjectID.的uri。我能够检索一个主题的属性和值,查询如下:

SELECT ?predicate ?object
WHERE {
  <GraphURI/#SubjectID> ?predicate ?object
} 

但是,我想对RDF/XML序列化中由cim:ACLineSegment元素表示的所有资源都这样做。序列化是这样的:

<cim:ACLineSegment rdf:ID="_05b8">
    <!-- some code... -->
</cim:ACLineSegment>
    <!-- other blocks -->
<cim:ACLineSegment rdf:ID="_05b9">
    <!-- some code... -->
</cim:ACLineSegment>

我想要像下面这样的东西。这可能吗?

SELECT ?predicate ?object
WHERE {
  cim:ACLineSegment ?predicate ?object
}

检索具有相同RDF/XML元素名称而不使用ID的所有资源

我的问题是,我想检索所有主题包含cim:ACLineSegment,无论它们的ID是什么

<cim:ACLineSegment rdf:ID="_05b8">
    <!-- some code... -->
</cim:ACLineSegment>

你的受试者不"含有"cim:ACLineSegment。主题在RDF中不包含任何内容。资源(包括三元组的主题)由uri标识。RDF基于三元组的形式为{主题、谓词、对象}。您所展示的代码片段是RDF/XML,它是三元组的一种特殊序列化。在您所展示的代码片段中,有一些形式为{<.../_05b8>, rdf:type, cim:ACLineSegment}的三元组。也就是说,您的主题的值cim:ACLineSegment作为rdf:type属性的值。

为了进一步解释,假设您有以下数据。(顺便说一下,在将来,如果您提供最少但完整的示例数据将会更有帮助。您提供的数据不完整,我们无法对其进行查询,并且我们无法确定它在上下文中是什么。

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ex="http://stackoverflow.com/q/23432445/1281433/ex#"
    xml:base="http://stackoverflow.com/q/23432445/1281433/ex#">
  <ex:Person rdf:ID="Mary">
    <ex:hasName>Mary</ex:hasName>
  </ex:Person>
  <ex:Person rdf:ID="Jim">
    <ex:hasName>James</ex:hasName>
    <ex:hasAge rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">34</ex:hasAge>
  </ex:Person>
  <ex:Person rdf:ID="John">
    <ex:hasName>John</ex:hasName>
  </ex:Person>
</rdf:RDF>

如果你看一下N-Triples序列化中的数据(每行只有一个三元组),你会看到这些三元组:

<http://stackoverflow.com/q/23432445/1281433/ex#Mary> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://stackoverflow.com/q/23432445/1281433/ex#Person> .
<http://stackoverflow.com/q/23432445/1281433/ex#Mary> <http://stackoverflow.com/q/23432445/1281433/ex#hasName> "Mary" .
<http://stackoverflow.com/q/23432445/1281433/ex#John> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://stackoverflow.com/q/23432445/1281433/ex#Person> .
<http://stackoverflow.com/q/23432445/1281433/ex#John> <http://stackoverflow.com/q/23432445/1281433/ex#hasName> "John" .
<http://stackoverflow.com/q/23432445/1281433/ex#Jim> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://stackoverflow.com/q/23432445/1281433/ex#Person> .
<http://stackoverflow.com/q/23432445/1281433/ex#Jim> <http://stackoverflow.com/q/23432445/1281433/ex#hasName> "James" .
<http://stackoverflow.com/q/23432445/1281433/ex#Jim> <http://stackoverflow.com/q/23432445/1281433/ex#hasAge> "34"^^<http://www.w3.org/2001/XMLSchema#integer> .

注意到所有这些rdf:type三元组吗?这是因为在RDF/XML语法(§2.13类型化节点元素)中,与资源相对应的元素将元素名作为rdf:type的值。因此,上面的RDF/XML实际上是该数据的简写:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ex="http://stackoverflow.com/q/23432445/1281433/ex#" > 
  <rdf:Description rdf:about="http://stackoverflow.com/q/23432445/1281433/ex#Mary">
    <rdf:type rdf:resource="http://stackoverflow.com/q/23432445/1281433/ex#Person"/>
    <ex:hasName>Mary</ex:hasName>
  </rdf:Description>
  <rdf:Description rdf:about="http://stackoverflow.com/q/23432445/1281433/ex#Jim">
    <rdf:type rdf:resource="http://stackoverflow.com/q/23432445/1281433/ex#Person"/>
    <ex:hasName>James</ex:hasName>
    <ex:hasAge rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">34</ex:hasAge>
  </rdf:Description>
  <rdf:Description rdf:about="http://stackoverflow.com/q/23432445/1281433/ex#John">
    <rdf:type rdf:resource="http://stackoverflow.com/q/23432445/1281433/ex#Person"/>
    <ex:hasName>John</ex:hasName>
  </rdf:Description>
</rdf:RDF>

用N3或Turtle语法查看数据也很有帮助,因为它们更接近SPARQL查询语法:

@prefix ex:    <http://stackoverflow.com/q/23432445/1281433/ex#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
ex:Mary  a          ex:Person ;
        ex:hasName  "Mary" .
ex:John  a          ex:Person ;
        ex:hasName  "John" .
ex:Jim  a           ex:Person ;
        ex:hasAge   34 ;
        ex:hasName  "James" .

所有这一切意味着您只是想要请求具有指定类型的东西。你的查询应该是:

select ?predicate ?object where {
  ?subject rdf:type cim:ACLineSegment ;     # You can use `a` instead of rdf:type.
           ?predicate ?object
}