我目前正在使用SPARQL(和TopBraidComposer)。我有一个查询,它只返回匹配的文字,然后基于不想要某些类别过滤掉文字。
目前,此查询需要很长时间才能运行,我认为这是导致延迟的FILTER。我想知道是否有人会更好更快地过滤掉(不返回)包含一组关键词的行(例如cat1,cat2,cat3)。
截至目前,我正在使用;
SELECT ?category
WHERE {
?s1 ?p ?category .
?s2 ?p ?category .
FILTER (str(?category) != "Cat1") .
FILTER (str(?category) != "Cat2") .
FILTER (str(?category) != "Cat3") .
FILTER (str(?category) != "Cat4") .
FILTER (str(?category) != "Cat6") .
FILTER (str(?category) != "Cat8") .
}
答案 0 :(得分:2)
目前尚不清楚你已经减少了多少你的例子,但是你提供的代码所做的工作量超出了它的需要。
SELECT ?category
WHERE {
?s1 ?p ?category .
?s2 ?p ?category .
FILTER (str(?category) != "Cat1") .
FILTER (str(?category) != "Cat2") .
FILTER (str(?category) != "Cat3") .
FILTER (str(?category) != "Cat4") .
FILTER (str(?category) != "Cat6") .
FILTER (str(?category) != "Cat8") .
}
假设您的数据
:a :p "Cat0" .
:b :p "Cat0" .
然后?s1
,?s2
,?p?
和?category
的绑定可以
?s1 ?s2 ?p ?category
--------------------
:a :a :p "Cat0"
:a :b :p "Cat0"
:b :b :p "Cat0"
:b :a :p "Cat0"
这是选择"Cat0"
的四种方法。你说你想要文字,但是现在你要点击各种?category
并多次应用str
。你可以这样做:
SELECT DISTINCT ?category
WHERE {
?s ?p ?category .
FILTER( isLiteral(?category) &&
!(str(?category) in ("Cat1", "Cat2", "Cat3",
"Cat4", "Cat6", "Cat8")) )
}