2013-07-15 35 views
3

首先,我必须道歉,因为在涉及XML,RDF和SPARQL查询时我非常新。我所有的知识都是基于3天的大量阅读,所以它没有完全沉浸。然而,当我试图使用Jena查询大型RDF文件时遇到的一个问题是如何获取作为超类的一部分的所有实例如何在SPARQL中查找引用另一个对象的对象

对不起,如果这是措辞不良,所以这里是一个例子。在我的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/instances。

在我目前的尝试中,我可以直接查询ConnectionPotential,但两者都不适用。因此,该查询返回所有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" . 

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

回答

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条款删除您不想要的人。

+0

这正是我想要的!没想到这是最后直截了当的。非常感谢 –

相关问题