2015-03-19 245 views
0

我有一个RDF数据库(AFAIK),用于存储映射到RDF三元组的Java对象。如何使用SPARQL查询RDF三元组列表?

我现在想要做的是查询特定类型的所有对象的列表。

我想是这样的,在这里我已经把我的语法的想象:

PREFIX xyz: <http://foo.com/myclassname#> 
SELECT * 
WHERE { 
    xyz:* name ?name 
} 

我想说的是,我想这代表了类型myclassname主题的名称所有三元组。如何正确执行此操作?

现在我不能给你提供错误消息,因为我没有运行系统,但是我确信我不太了解SPARQL查询,所以请对此进行说明。

回答

1

SPARQL查询通常采用?subject ?predicate ?object的形式。因此,您需要运行一个这样的简单查询来了解是否需要将您的限制放在?Predicate的位置,或者您需要为查询添加另一个三元组(?object ?x ?y)。更多示例请参考SPARQL for begginers

您的答案简而言之就是,您可以根据特定类型进行查询,但您需要知道将此类型限制放在哪里。

因此,例如在DBpedia中,如果你想获得的一切的标签,你可以说:

select distinct * 
where 
    {?s rdfs:label ?o} 
LIMIT 100 

如果你想要这个标签是一个名字,你需要指定对象的类型:

select distinct * 
where 
    {?s rdfs:label ?o. 
    ?s a dbpedia-owl:Person} 
LIMIT 100 
+0

因为对于不同类型的对象,谓词(例如“name”)和对象(例如“Foo”)可以是相等的,所以我肯定需要将限制放在主语中。因此,类型信息只能在主题中找到。 – 2015-03-19 13:33:41

+0

所以你已经知道在哪里看。只是在你的查询中,只要求所有不同的主题,然后你就知道你在找什么类型。 – Artemis 2015-03-19 13:37:51

+0

Artemis:我的问题是关于SPARQL **语法**:我知道我想要什么,但我不知道如何在SPARQL中表达它。 – 2015-03-19 14:01:41

1

SPARQL查询的确切语法取决于您的数据在RDF中的建模方式。让我们假设一类MyClass的对象被表示为在RDF数据库如下,他们有一个name属性my:name

@prefix my: <http://example.org/my/> . 

my:object1 a my:MyClass . 
my:object1 my:name "object 1" . 

查询找回在这个确切的时装模型中的所有对象,他们的名字会看像这样:

PREFIX my: <http://example.org/my/> 

SELECT ?x ?name 
WHERE { 
    ?x rdf:type my:MyClass ; 
     my:name ?name . 
} 

SPARQL查询工作作为图模式匹配器:查询查找的三元匹配WHERE子句中指定的模式的任意组合:所以我们正在寻找˚F或两个三元组,其中一个表示rdf:type财产的值为my:MyClass,另一个表示具有相同主题的另一个三元组应该具有名为my:name的属性,其中我们希望返回该值(绑定到变量?name)。

正如您所见,它取决于您的特定RDF模型:在您的数据库中,类的名称(my:MyName)和属性名称(my:name)可能不同。因此,在编写可在您的特定情况下工作的查询之前,您需要了解如何将数据建模为RDF。

编辑作为一旁:SPARQL具有用于属性rdf:type,这是a的简化符号。所以位?x rdf:type my:MyClass通常写为?x a my:MyClass。我想强调一个事实,即您正在查询三元组/属性,这就是我使用实际属性名称的原因。