2016-08-15 3 views
0

이 내 최소 데이터입니다 : 이것은 내 쿼리입니다이 예제에서는 작동하지 유착

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
    PREFIX rs: <http://www.SemanticRecommender.com/rs#> 
    PREFIX mo: <http://www.musicontology.com/mo#> 
    PREFIX : <http://www.musicsemanticontology.com/mso#> 

    mo:5th_symphony_for_beethoven a mo:GermanSymphony . 
    :symphonyFestival2016 a rs:TemporalContext ; rs:appliedOnItems mo:GermanSymphony ; rs:canBeRecommendedFrom "2016-07-01T00:00:00-00:00"^^xsd:dateTime ; rs:canBeRecommendedUntil "2016-09-01T00:00:00-00:00"^^xsd:dateTime . 

:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rs: <http://www.SemanticRecommender.com/rs#> 
PREFIX mo: <http://www.musicontology.com/mo#> 
PREFIX : <http://www.musicsemanticontology.com/mso#> 

    SELECT ?item ?resultForMe ?matchedWeight ?defaultMatchedTemporalContext 
    WHERE 
     { 
    values ?item {mo:5th_symphony_for_beethoven} 
      VALUES (?defaultMatchedTemporalContext ?defaultNotMatchedTemporalContext ?defaultNoTemporalContext) {(2 0.5 1)} 
      ?temporalContext 
         rdf:type   rs:TemporalContext ; rs:appliedOnItems ?itemClass . 
         OPTIONAl {  ?item  rdf:type   ?itemClass 
      OPTIONAL { ?temporalContext rs:canBeRecommendedFrom ?fromLimit } 
      OPTIONAL { ?temporalContext rs:canBeRecommendedUntil ?untilLimit } 
      OPTIONAL { ?temporalContext rs:hasWeightIfContextMatched ?matchedWeight } 
      OPTIONAL { ?temporalContext rs:hasWeightIfContextDoesNotMatch ?unmatchedWeight } 
    BIND(if(((?fromLimit <= now()) && (now() <= ?untilLimit)) , coalesce (?matchedWeight, ?defaultMatchedTemporalContext),2) as ?resultForMe) 
    } 
} 

는 결과입니다

enter image description here

resultForMe 봐, 어떤 값이없는, 이유는 무엇입니까? 이 질문은이지만 defaultMatchedTemporalContext에는 값이 있습니다.

나는 당신에게 당신이 원하는 경우에, 당신이 문제는 절이었다이었다

+0

질문은 1) IF식이 작동하는지 여부가 나에게 잘 보이고 2) 먼저 평가되는 것이 무엇인지, VALUES 또는 'BIND'. – AKSW

+0

그건 그렇고, 간단하게 모든 선택 항목을 제거 할 것입니다. – AKSW

+0

@AKSW 귀하의 의견을 보내 주셔서 감사합니다. 1) 예. IF가 확실한 경우, 합치기를 임의의 값으로 바꾸십시오. 3) 2) 값은 바인드 이전이므로 먼저 평가해야합니다. (최소한 신참자의 지식에) –

답변

1
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rs: <http://www.SemanticRecommender.com/rs#> 
PREFIX mo: <http://www.musicontology.com/mo#> 
PREFIX : <http://www.musicsemanticontology.com/mso#> 

    SELECT ?item ?resultForMe ?matchedWeight ?defaultMatchedTemporalContext 
    WHERE 

{ 
    VALUES ?item {mo:5th_symphony_for_beethoven} 
    VALUES ?defaultNoTemporalContext { 1 } 
    VALUES ?defaultMatchedTemporalContext { 2 } 
    VALUES ?defaultNotMatchedTemporalContext { 0.5 } 
    ?temporalContext 
         rdf:type   rs:TemporalContext ; rs:appliedOnItems ?itemClass . 
         OPTIONAl {  ?item  rdf:type   ?itemClass. 
VALUES ?defaultMatchedTemporalContext { 2 } 

      OPTIONAL { ?temporalContext rs:canBeRecommendedFrom ?fromLimit } 
      OPTIONAL { ?temporalContext rs:canBeRecommendedUntil ?untilLimit } 
      OPTIONAL { ?temporalContext rs:hasWeightIfContextMatched ?matchedWeight } 
      OPTIONAL { ?temporalContext rs:hasWeightIfContextDoesNotMatch ?unmatchedWeight } 
    BIND(if(((?fromLimit <= now()) && (now() <= ?untilLimit)) , coalesce (?matchedWeight, ?defaultMatchedTemporalContext) ,2) as ?resultForMe) 
    } 
} 

RDF 단지 4 라인입니다, 당신의 SPARQL 저장소에 데이터를 업로드 할 수 있습니다 필요한 때문에 최소한의 데이터를했다 위의 절에서 같은 절에 넣으면 내 문제가 해결됩니다

+0

아래 내 대답보기 ... 당신이 OPTIONAL을 중첩시켜야한다고 생각하지 않습니다. – AKSW

+0

실제로 @AKSW는 그것을 원합니다. 나는 복잡한 시나리오를 가지고 있으며, 당신에게 약간의 것을 보여 줬습니다. +1 도움을, 나는 그것을 바란다 –

+0

좋아, 나는 거기에'rdf : type' 트리플 패턴에 더 많은 바운드가 있다는 것을 몰랐다. 그런 다음 내 대답을 삭제할 수 있습니다. 문제는 VALUES 절의 범위였습니다. – AKSW