首先我必须道歉,因为我对 XML、RDF 和 SPARQL 查询非常陌生。我所有的知识都是基于 3 天的大量阅读,所以它还没有完全深入。然而,我在尝试使用 Jena 查询大型 RDF 文件时遇到的一个问题是如何获取属于超类的所有实例?
对不起,如果这措辞不好,所以这里是一个例子。在我的 RDF 文件中,总是有一个主节点:
主节点
然后有些对象将此节点作为资源,例如:
<cim:Connection rdf:ID="connection_1">
<cim:Object.name>Connection Point 1</cim:Object.name>
<cim:Connection.node rdf:resource="#main_node_1"/>
</cim:Connection>
或者
<cim:Potential rdf:ID="potential_1">
<cim:Object.name>Equal Potential 1</cim:Object.name>
<cim:Potential.node rdf:resource="#main_node_1"/>
</cim:Connection>
现在我知道如何查询任何rdf:type
以及(有点)如何使用 SPARQL 进行图形查询。我要做的是首先找到 MainNode(我已经可以),然后找到引用此 MainNode 的所有元素/对象/类/实例。
根据我目前的尝试,我可以查询 aConnection
或Potential
直接查询,但不能同时查询两者。所以返回所有Connection
s 的查询将是:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cim: <http://iec.ch/TC57/2010/CIM-schema-cim15#>
SELECT ?object
WHERE {
?object cim:Connection.node ?mainNode .
?mainNode cim:Object.name "The Main Node" .
}
对于所有Potential
s,查询将是:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cim: <http://iec.ch/TC57/2010/CIM-schema-cim15#>
SELECT ?object
WHERE {
?object cim:potential.node ?mainNode .
?mainNode cim:Object.name "The Main Node" .
}
但是我需要同时提取两者并且不想使用UNION
,因为可能还有更多我没有包含的类。我的尝试是将?object
行更改为:
?mainNode cim:*.name "The Main Node" .
但是星号*
不允许我在这里提供任何课程。实际上,两者Connection
和Potential
都可以看作是包含变量的超类的子类node
。