我正在尝试从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
时过滤掉整个结果?
答案 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会产生相同的影响,因为没有属性类型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
我不确定这是否是您正在寻找的答案