检索具有相同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
}
我的问题是,我想检索所有主题包含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
}