加速SPARQL查询 - 过滤掉包含的行

时间:2014-01-29 14:25:42

标签: filter sparql

我目前正在使用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") .
}

1 个答案:

答案 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")) )
}