SPARQL查询限制了答案

时间:2014-11-27 12:43:41

标签: netbeans sparql jena

嘿,我试图得到只包含一些成分的所有食谱。例如,如果我有西红柿和面包的食谱,我只是说我会使用tomate那种食谱不应该出现。如果我有任何只含这种成分的食谱,那么它应该出现。我做了以下查询:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>`
PREFIX rec:<http://www.receta.org#>
SELECT reduced ?r 
WHERE { 
        ?x rdf:type rec:Receta .
        ?x rdfs:label ?r.
        ?x rec:Ingrediente rec:Tomato.
        ?x rec:Ingrediente ?i.
        FILTER (?i=rec:Tomato) 
}

但问题在于它显示了包含该成分的所有配方以及更多。我怎么能限制这个?有人能帮助我吗?

2 个答案:

答案 0 :(得分:0)

查看FILTER NOT EXISTS

所以类似(取决于您的数据的确切性质,但未显示):

 WHERE { 
    ?x rdf:type rec:Receta .
    ?x rdfs:label ?r.
    FILTER NOT EXISTS {?x rec:Ingrediente rec:Tomato }
 }

全部是?x,?r其中?x没有属性/值&#34; rec:Ingrediente rec:Tomato&#34;。

答案 1 :(得分:0)

您的第一个查询

SELECT reduced ?r WHERE { 
  ?x rdf:type rec:Receta .
  ?x rdfs:label ?r.
  ?x rec:Ingrediente rec:Tomato.
  ?x rec:Ingrediente ?i.
  FILTER (?i=rec:Tomato) 
}

匹配任何以番茄为成分的配方。使用具有常量值的过滤器与写入相同:

SELECT reduced ?r WHERE { 
  ?x rdf:type rec:Receta .
  ?x rdfs:label ?r.
  ?x rec:Ingrediente rec:Tomato.
}

相反,您需要选择配方并删除那些具有除某些设置之外的成分的配方。 AndyS's answer提到过滤器不存在,这是一个开始。具体来说,如果您想确保所有成分都是例如番茄,罗勒和奶酪,那么您可以编写如下查询:

SELECT reduced ?r WHERE { 
  ?x rdf:type rec:Receta .
  ?x rdfs:label ?r.
  filter not exists {
    ?x rec:Ingrediente ?i
    filter( ?i not in (rec:Tomato, rec:Basil rec:Cheese) )
}

找到所有食谱,然后去除任何含有其中一种成分的成分。