首先,我必须道歉,因为我在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的所有元素/ objetcs / classes / instance。
根据我目前的尝试,我可以直接查询Connection
或Potential
,但不能同时查询两者。因此,返回所有Connection
的查询将是:
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
,查询将是:
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
的超类的子项。
答案 0 :(得分:5)
我认为你要求的是任何与主节点相距三个连接的节点:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cim: <http://iec.ch/TC57/2010/CIM-schema-cim15#>
SELECT ?relationship ?object
WHERE {
?object ?relationship ?mainNode .
?mainNode cim:Object.name "The Main Node" .
}
该查询将告诉您直接连接到主节点的所有节点以及连接谓词的URI。
如果您只想要某些从相关节点到主节点的连接,那么您需要在联合中枚举它们,或者添加FILTER
子句以删除它们你不想要的。