我正在尝试收集特定主题的所有陈述(假设是 Václav Havel - Q36233),但我需要排除包含任何引用的所有陈述。
SELECT ?subjectLabel ?property ?object ?objectLabel
WHERE {
?subject ?property ?object.
FILTER (?subject = wd:Q36233)
FILTER(REGEX(STR(?property), "http://www.wikidata.org/prop/.*"))
FILTER(REGEX(STR(?object), "http://www.wikidata.org/entity/Q.*"))
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
此查询生成 194 条语句,但其中也包含引用。
我尝试了很多方法来更改查询,通过添加 MINUS 运算符和 FILTER 运算符,但这些方法都不起作用,并且通常会产生 0 个结果。
您可以使用此查询:
SELECT DISTINCT ?subjectLabel ?property ?object ?objectLabel
WHERE {
?subject ?property ?object .
?subject ?p ?stmt.
?stmt ?ps ?object .
BIND (URI(REPLACE(STR(?p),STR(p:),STR(wdt:))) as ?property)
BIND (URI(REPLACE(STR(?p),STR(p:),STR(ps:))) as ?ps)
FILTER (?subject = wd:Q36233)
FILTER (REGEX(STR(?p), STR(p:)))
FILTER (REGEX(STR(?object), STR(wd:)))
FILTER NOT EXISTS { ?stmt prov:wasDerivedFrom ?ref . }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
其中
FILTER NOT EXISTS { ?stmt prov:wasDerivedFrom ?ref . }
正在检查语句 ?stmt
是否没有引用。
请注意,
?subject ?p ?stmt. ?stmt ?ps ?object .
几乎等同于 ?subject ?property ?object .
,只不过 wdt: 前缀排除已弃用的语句,而 p: 前缀则不排除。因此 ?subject ?property ?object .
并不是多余的,因为一般来说你无法安全地删除它。
使用 Blazergraph 的 QueryHints 的更高效版本:
SELECT DISTINCT ?subjectLabel ?property ?object ?objectLabel
WHERE {
{
SELECT ?subject ?p ?stmt ?object
WHERE {
?subject ?p ?stmt.
?stmt ?ps ?object .
FILTER (?subject = wd:Q36233)
FILTER (REGEX(STR(?p), STR(p:)))
FILTER (REGEX(STR(?object), STR(wd:)))
hint:SubQuery hint:runOnce true .
}
}
hint:Prior hint:runFirst true .
?subject ?property ?object .
BIND (URI(REPLACE(STR(?p),STR(p:),STR(wdt:))) as ?property)
BIND (URI(REPLACE(STR(?p),STR(p:),STR(ps:))) as ?ps)
FILTER NOT EXISTS { ?stmt prov:wasDerivedFrom ?ref . }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}