2014-01-29 41 views
3

的行我目前正在使用SPARQL(和TopBraidComposer)。我有一个查询只返回匹配的文字,然后根据不需要某些类别过滤文字。加速SPARQL查询 - 筛选出包含

目前,这个查询需要很长时间才能运行,我认为这是我的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") . 
} 

回答

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"))) 
} 
+0

我试过你的建议,它的工作:)。我没有意识到我原来的查询需要多少工作(感谢你包括一个例子)。感谢您的帮助! –