Запрос C-SPARQL - соответствует точному строковому литералу - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю с C-SPARQL и хочу запросить тройки, полученные из потока.Однако я столкнулся с проблемой при использовании запроса, в котором я хочу сопоставить точный строковый литерал.Я обычно получаю результат с моими запросами (данные поступают из строки), но когда я добавляю точное совпадение для строкового значения для литерала, я всегда не получаю никаких результатов.Как будто не найдено ни одного совпадения.Однако, если я посмотрю на все тройки, полученные из моего потока, найдутся записи, которые соответствуют моему строковому литералу.

Вот пример моего запроса:

REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s 
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s] 
WHERE { 
?s person:name "Huber" .
}

Я также попытался работать с фильтрамии regex, которые являются следующими 2 примерами:

REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o 
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s] 
WHERE { 
 ?s person:name ?o FILTER ( ?o = "Huber" ) .
}

REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o 
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s] 
WHERE { 
 ?s person:name ?o FILTER (regex(?o, '^Huber$')) .
}

Ни один из запросов не дает никаких результатов, как будто совпадений нет.

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

REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o 
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s] 
WHERE { 
 ?s person:name ?o .
}

Я не уверен, поддерживает ли C-SPARQL все функции SPARQL.В другом посте я читал, что round () не поддерживается в C-SPARQL.Поскольку совпадение точной строки является основной функцией, по крайней мере, на мой взгляд, я не уверен, что могу сделать что-то не так или пропущу некоторые детали.Я пробовал запросы в SPARQL, запрашивая триплетное хранилище, и там все запросы работают просто отлично.

Итак, я немного запутался, почему совпадение строк здесь не работает в C-SPARQL.У кого-нибудь есть какие-либо советы или предложения?


РЕДАКТИРОВАТЬ (дополнительная информация о том, как выглядят мои данные):

Данные, которые я пытаюсь запросить с помощью C-SPARQL, являются JSON-LDзаписи, поступающие из веб-потока.Поток создается и публикуется с помощью Triplewave .

Вот небольшой пример JSON-LD:

[
  {
    "@id": "http://Stream/d7e4e816-0931-42ce-a21a-cbfaa552855d",
    "http://www.w3.org/ns/prov#generatedAtTime": [
      {
        "@value": "2018-11-14T07:08:45.182Z"
      }
    ],
    "@graph": [
      {
        "@id": "http://schema.org/Person#1234",
        "http://schema.org/name": [
          {
            "@value": "Huber"
          }
        ]
      },
      {
        "@id": "http://schema.org/Job#1234",
        "http://schema.org/title"": [
          {
            "@value": "Professor"
          }
        ]
      }
    ]
  }
]

Нет информации о типе или языкеtag.

Для запроса моего веб-потока с помощью C-SPARQL я реализовал RdfStream, который получает данные JSON-LD через веб-сокет, и создал RdfQuadruple всех записей в моем графике и помещаетэто в RdfStream.

Пример RdfQuadruple это:

http://schema.org/Person#1234 http://schema.org/name Huber . 

1 Ответ

0 голосов
/ 11 ноября 2018

Функция STR( value ) решила мою проблему. Я должен преобразовать значение в строку заранее

Так работал следующий запрос:

REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o 
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s] 
WHERE { 
 ?s person:name ?o FILTER ( str(?o) = "Huber" ) .
}

Спасибо за ваши предложения.

...