Python 从sparql查询结果中筛选出某些属性

Python 从sparql查询结果中筛选出某些属性,python,sparql,dbpedia,Python,Sparql,Dbpedia,我试图从sparql查询的结果中过滤掉某些属性,例如dbpprop:one。我正在查询dbpediasparqlendoint 更确切地说,我想用以下伪代码表示: quantity_of_interest, property, value, property_type = sparqlQuery(query) if property_type == rdf:Property: pass else: return quantity_of_interest, property, va

我试图从sparql查询的结果中过滤掉某些属性,例如dbpprop:one。我正在查询dbpediasparqlendoint

更确切地说,我想用以下伪代码表示:

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

这是我在

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

您可以过滤掉dbprop:properties, 我试图过滤掉某些属性,例如,dbpprop:one-from SPARQL查询的结果。我正在查询dbpediasparql端点

如果要在结果集中绑定属性,并且要排除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,您仍然可以像这样过滤掉。如果您想这样做,可以使用筛选器不存在{…}:

对于DBpedia,它现在是一样的, 事实证明,这些对DBpedia的影响相同,因为没有类型为rdf:Property的属性,也没有dbpprop:properties;以下查询返回0:

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

不完全是因为此查询过滤掉没有rdf:type的属性。但是,我想保留与没有rdf的属性相关联的结果:type@rlkrlk如果将筛选器移动到可选模式中,则应该可以执行此操作:可选{property rdf:type?type filter?type!=rdf:property}。@Joshua Taylor不,它不会将任何值绑定到?type仅此而已。看一看,您会得到诸如其类型为rdf的属性:Property@rlkrlk我看到了您的查询结果,但我无法说出您运行的查询是什么我知道它嵌入在URL中,但我不会尝试对其进行解码。这个问题中的查询可能会绑定?type的值,但您不会看到它,因为只选择了?qoi?property?值。也许您希望选择不同的?qoi?属性?值?类型?就是这样,筛选器不存在{?属性rdf:type rdf:property}工作正常。有人在answers.semanticweb.composible duplicate上回答了我的问题,链接副本的composible duplicate排除了基于前缀的属性,但同样的方法在这里也适用,只使用了更简单的测试。您只需要使用filter?type!=财产。哦,我有点误解了这个问题;可能重复的答案实际上比您需要的要多,但问题中的示例代码显示了如何做您想做的事情。我不这么认为,因为我想在answers.semanticweb.com上保留没有rdf:type的属性,比如foaf属性duplicated:应该有某种联邦查询,或者可能是由于推断,因为当我在python脚本r=urllib2.urlopen'http://dbpedia.org/sparql/?query=select%20%3Fp%20%7B%20%3Fp%20a‌​%20rdf%3属性%20.%20筛选器%20!strstarts%20str%3Fp%2C%20strdbpprop%3A%20‌​%20%20%7D&format=json“我有几个属性,当我使用r。。。
quantity_of_interest, property, value, property_type = sparqlQuery(query)
if property_type == rdf:Property:
    pass
else:
    return quantity_of_interest, property, value
p rdf:type rdf:Property
filter not exists { ?p rdf:type rdf:Property }
select (count(*) as ?num) where {
 ?p a rdf:Property
 filter( !strstarts( str(?p), str(dbpprop:) ) )
}
limit 100