Фильтр в запросе Sparql не работает

Я выполняю запрос sparql к одной из моих конечных точек sparql, которая поддерживает только Sparql 1.0.
Я пытаюсь получить список пользователей из магазина, используя следующий запрос:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX tmp: <http://example.com/schema/temp#>
PREFIX resource: <http://example.com/2010/record/schema#>
Describe ?userURI
WHERE 
{
    ?userURI rdf:type resource:User.
    OPTIONAL
    {               
        ?userURI tmp:dataCleanupStatus ?cleanUpStatus.
        ?userURI tmp:lastDataCleanupDate ?cleanUpDate.                  
    }
    FILTER 
    ( 
        (!bound(?cleanUpStatus) || ?cleanUpStatus !="Running")
    )
                    FILTER(    
        (!bound(?cleanUpDate) || ?cleanUpDate < "2012-04-11" )
    )

}

С помощью приведенного выше запроса я пытаюсь получить пользователей, где:

  1. Либо триплет состояния очистки не существует, либо статус не «Выполняется».
  2. Тройка clearnUpDate либо не существует, либо меньше указанной даты.

он не возвращает запись, которую должен возвращать.
Вы можете сказать, что мне следует использовать функции xsd, но они поддерживаются только в Sparql 1.1.


Пожалуйста посоветуй.
Измененный запрос:


PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX tmp: <http://example.com/schema/temp#>
PREFIX resource: <http://example.com/2010/record/schema#>
Describe ?userURI
WHERE 
{
    ?userURI rdf:type resource:User.
    OPTIONAL
    {               
        ?userURI tmp:dataCleanupStatus ?cleanUpStatus.

    }

    OPTIONAL
    {               
        ?userURI tmp:lastDataCleanupDate ?cleanUpDate.                  
    }
    FILTER 
    ( 
        !bound(?cleanUpStatus) || ?cleanUpStatus !="Running"
    )
    FILTER
    (    
        !bound(?cleanUpDate) || ?cleanUpDate < "2012-04-11" 
    )

}



person Ravish    schedule 13.04.2012    source источник


Ответы (1)


Проблема, вероятно, заключается в сравнении даты, если предположить, что она хранится как типизированный литерал xsd:date в исходных данных. Вы не можете сравнивать строки с датами без преобразования типов.

Некоторые вещи, чтобы попробовать:

?cleanUpDate < "2012-04-11"^^xsd:date    # Compare against date
STR(?cleanUpDate) < "2012-04-11"         # Convert to string before comparison

Кроме того, в зависимости от структуры данных вам могут понадобиться два отдельных блока OPTIONAL для ?cleanUpStatus и ?cleanUpDate.

person cygri    schedule 13.04.2012
comment
на самом деле я не могу использовать xsd:date, так как они являются частью Sparql 1.1, а моя конечная точка поддерживает только 1.0... Кроме того, я сохраняю их как строковые литералы. - person Ravish; 13.04.2012
comment
Спасибо за совет. Я изменил запрос в соответствии с вашим предложением, и пока он работает нормально. - person Ravish; 13.04.2012
comment
Для справки: xsd:date типизированные литералы, используемые в моем примере, являются частью SPARQL 1.0 и широко поддерживаются. Вы, вероятно, думаете о функциях обработки даты/времени и сравнения, которые были добавлены в SPARQL 1.1. - person cygri; 13.04.2012
comment
какая онтология мне нужна, если я хочу использовать xsd:date? На самом деле я храню даты как строковые литералы... - person Ravish; 13.04.2012
comment
Вам не нужно использовать какую-либо онтологию. Это встроенный тип данных в RDF. Вам просто нужно объявить префикс xsd, вот и все. Если ваш вопрос касается URI пространства имен для префикса xsd, просто найдите его на prefix.cc. - person cygri; 14.04.2012