3

首先我必须道歉,因为我对 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 的所有元素/对象/类/实例。

根据我目前的尝试,我可以查询 aConnectionPotential直接查询,但不能同时查询两者。所以返回所有Connections 的查询将是:

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" . 
}

对于所有Potentials,查询将是:

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" . 

但是星号*不允许我在这里提供任何课程。实际上,两者ConnectionPotential都可以看作是包含变量的超类的子类node

4

1 回答 1

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子句来删除你不想要的那些。

于 2013-07-15T11:53:40.157 回答