2014-12-03 3 views
0

Im은이 sparql 쿼리를 시도하지만, 무엇이 잘못되었는지 찾아내는 데 어려움이 있습니다. 나는 그 성분 들이나 그 이하의 모든 조리법들을 가지고 가고 싶다. 예 : receipe 1 : 토마토 receipe 2 : 토마토와 소금 receipe 3 : 토마토, 소금, 양파.SPARQL 쿼리 RDF 온톨로지

그리고 나는 다음과 같은 쿼리가 :

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 (count (?i) as ?cuantos) WHERE { 

    ?x rdf:type rec:Receta . 
    ?x rdfs:label ?r. 

    filter not exists { 
     ?x rec:Ingrediente ?i 
     filter(?i not in (rec:Tomato, rec:Salt)) 
    } 
} 
GROUP BY ?r 

나는 것은 첫 번째를 표시하기를. 두 번째 것이 아니라 마지막 것이 아닙니다.

그것의 다만보기 그러나 나는 실제로 그 3 개의 조리법으로 그것을하고 싶다, 거대한 데이타베이스를 말하게하고, 토마토와 소금보다 적은 성분을 가진 조리법을 예를 들면 가지고 가고 싶다. 그래서 내 질문을 어떻게 수정할 수 있습니까?

자신을 설명하려고 것 : 예를 들어

:

내가 수백 조리법을 가진 거대한 데이터베이스를 가지고 있다고 할 수 있습니다. 초콜릿과 우유

그리고 내 쿼리에서 나는 토마토, 소금, 식초와 조리법을 원한다고 : 양파와 고기 Receipe3 : 토마토와 식초 Receipe4 토마토와 소금 Receipe2 : Recipe1 : 그 중 일부는 . 그래서 그 경우에는 레시피 1과 레시피 3을 얻고 싶습니다. 레시피 1에는 토마토와 소금이 있고 레시피 3에는 토마토와 식초가 들어 있기 때문에, 제가 말한 것보다 적은 성분을 가지고 있습니다. 토마토 Recipe5 : 토마토, 식초, 소금, 양파 Recipe6가 :

Recipe4가 : 소금 Recipe6는 토마토, 식초, 소금

내가 다시는 내 쿼리를 실행하면 나는 것 좀 더 조리법을 추가하는 것이 지금 말할 수 있습니다 recipe1, recipe3, recipe4 및 recipe5를 갖고 싶습니다. 원인 그 조리법은 그 성분 이하의 성분입니다. 나는 레시피 6의 원인에 내가 원하는 것과 심지어 레시피가 아닌 것보다 더 많은 재료를 가지고 싶다 .7.

감사합니다.

+0

그 성분이 적은 요리법을 원한다면 토마토와 소금 만 포함되어 있기 때문에 요리법 번호 2를 포함해서는 안됩니까? –

+0

당신이 찾고있는 것을 정확히 분명히 할 수 있습니까? 재료가 지정된 것의 하위 집합 인 요리법을 요구하는 것처럼 들리지만, 그렇다면 두 번째 조리법을 왜 원하지 않습니까? –

+0

OP가 답변으로 게시되었지만 (코멘트로 게시 했어야 함) : "예제로 넣으십시오.하지만 실제로는 3 개의 조리법으로 처리하고 싶습니다. 거대한 데이터베이스라고 말하면됩니다. 예를 들어 토마토와 소금보다 성분이 더 많습니다. " –

답변

2

정확하게 이해한다면, 재료 세트를 지정하고 그 재료가 그 재료 세트의 특성 하위 세트 인 레시피를 선택하려고합니다 (또는 재료가 일부만 구성된 레시피, 예 귀하의 질문에 명확하게하지 마십시오). 어쨌든 실수를하기 쉬운 자연어로 예제를 작성하는 것이 아니라 작업 할 수있는 데이터를 제공하는 것이 더 낫습니다.이 경우 전혀 그렇게하는 것이 어렵지 않습니다. 예를 들어, 여기에 구 개 조리법, 이들 각각에 작은 거북이 파일의 일부 성분이있다 : 이제

@prefix : <urn:ex:> . 

:recipe1 :ingredient :tomato, :salt . 
:recipe2 :ingredient :onion, :meat . 
:recipe3 :ingredient :tomato, :vinegar . 
:recipe4 :ingredient :chocolate, :milk . 
:recipe5 :ingredient :tomato . 
:recipe6 :ingredient :salt . 
:recipe7 :ingredient :tomato, :vinegar, :salt, :onion . 
:recipe8 :ingredient :tomato, :vinegar, :salt . 
:recipe9 :ingredient :vinegar, :salt . 

을, 우리는, 요리법 모두 그 재료 지정된 세트에의 검색 쿼리를 작성할 수 있습니다 만 그 유지 특정 성분의 특정 수보다 적거나 같거나 적은 양의 성분. (group_concat 재료를 포함 할 필요는 없으며 각 레시피에 대한 성분 목록을 얻으려고했습니다.

having (count(distinct ?ingredient) <= 3) 

: 당신이 세 가지 재료와 조리법, 당신은 단지 중 하나에 라인

having (count(distinct ?ingredient) < 3) 

을 변경할 수 있도록하고 싶었다면)

prefix : <urn:ex:> 

select ?recipe (group_concat(?ingredient;separator=', ') as ?ingredients) { 
    ?recipe :ingredient ?ingredient 
    filter not exists { 
    ?recipe :ingredient ?other_ingredient 
    filter(?other_ingredient not in (:salt, :tomato, :vinegar)) 
    } 
} 
group by ?recipe 
having (count(distinct ?ingredient) < 3) 
---------------------------------------------- 
| recipe | ingredients      | 
============================================== 
| :recipe9 | "urn:ex:salt, urn:ex:vinegar" | 
| :recipe5 | "urn:ex:tomato"     | 
| :recipe6 | "urn:ex:salt"     | 
| :recipe3 | "urn:ex:tomato, urn:ex:vinegar" | 
| :recipe1 | "urn:ex:tomato, urn:ex:salt" | 
---------------------------------------------- 

having (count(distinct ?ingredient) < 4) 
+0

그게 내가 원하는 것.하지만 재료의 양으로 주문하고 싶어. 그래서 가지고 싶습니다 : Receipe5, receipe6. receipe9, receipe3, receipe1. 오해를해서 죄송합니다. 고맙습니다. – SomeAnonymousPerson

+0

질문에서 주문에 대한 언급은 없었지만 '개수 별 (별개의 성분)'을 추가하는 것만으로 문제가됩니다. [주문자] (http://www.w3.org/TR/sparql11-query/#modOrderBy)는 사양에 명확하게 설명되어 있습니다. –