从sparql查询结果中过滤掉某些属性

时间:2014-02-24 10:05:17

标签: python sparql dbpedia

我正在尝试从sparql查询的结果中过滤掉某些属性(例如dbpprop:个)。我正在查询dbpedia sparql endoint。

更确切地说,我想做的事情由以下伪代码表示:

quantity_of_interest, property, value, property_type = sparqlQuery(query)
if property_type == rdf:Property:
    pass
else:
    return quantity_of_interest, property, value

现在,我在一些python代码中过滤掉属性,然后使用以下sparql查询:

SELECT DISTINCT ?qoi ?property ?value (bif:either(?type=rdf:Property, 0, 1) as ?filter_out) 
WHERE { 
    ?qoi a foaf:Person. ?qoi ?property ?value. 
    OPTIONAL{?property rdf:type ?type }
}

如果filter_out == 0我放弃了整个结果。

有没有办法可以直接创建一个sparql查询,在?type == rdf:Property时过滤掉整个结果?

2 个答案:

答案 0 :(得分:1)

您可以过滤掉dbprop:属性

  

我试图过滤掉某些属性(例如,dbpprop:个)   SPARQL查询的结果。我正在查询DBpedia SPARQL端点。

如果您在结果集中绑定了属性,并且想要排除URI以dbpprop:前缀开头的那些属性,则可以使用

执行此操作
filter(!strstarts(str(?p),str(dbpprop:)))

或者您可以过滤掉不具有rdf:Property类型的属性。

你的伪代码看起来虽然做了一些略微不同的事情:

quantity_of_interest, property, value, property_type = sparqlQuery(query)
if property_type == rdf:Property:
    pass
else:
    return quantity_of_interest, property, value

每个属性都可以具有rdf:Property类型,因为它是RDF属性的类。 DBpedia可能 三重

p rdf:type rdf:Property
当然,对于每个属性p

,所以您仍然可以像这样过滤掉所有内容。如果您想做什么,可以使用filter not exists { … }

来完成
filter not exists { ?p rdf:type rdf:Property }

对于DBpedia,它现在一样,

事实证明,这些对DBpedia会产生相同的影响,因为没有属性类型rdf:Property不是也属于dbpprop:属性;以下查询返回0

select (count(*) as ?num) where {
 ?p a rdf:Property
 filter( !strstarts( str(?p), str(dbpprop:) ) )
}
limit 100

但是一个选项更具未来兼容性。

我强烈建议您使用strstarts过滤器,而不是not exist。虽然属性的URI不能随时间变化(即,URI是常数),但关于它的三元组可以改变。因此,如果您过滤掉dbpprop:属性,那么您永远不会意外地过滤掉超出您预期的内容。但是,如果您过滤掉rdf:Property作为类型的内容,那么如果添加更多p rdf:type rdf:Property三元组,您将很容易在将来丢失结果(并且看起来这样的添加会在逻辑上兼容)

答案 1 :(得分:0)

这个在http://dbpedia.org/snorql/?query=

为我工作
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?qoi ?property ?value
WHERE { 
    ?qoi a foaf:Person. 
    ?qoi ?property ?value. 
OPTIONAL{ 
    ?property rdf:type ?type 
FILTER( ?type != "rdf:Property" ) }
}
LIMIT 100

我不确定这是否是您正在寻找的答案