Как прочитать значение конкретного диапазона свойства объекта - PullRequest
0 голосов
/ 12 июня 2019

Я новичок в работе с онтологиями и нахожу проблемы с работой моего SPARQL-запроса, пытаясь прочитать значение определенного свойства объекта, имеющего несколько диапазонов Снимок свойства объекта

, пытаясь выполнить этот запросВернуть все свойства объекта Результат выполнения , Визуализация протеже

PREFIX ns: <http://www.semanticweb.org/pavilion/ontologies/2017/5/untitled-ontology-66#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT *
WHERE {
    ns:star1086 ns:possesses ?z .
}

Желаемый результат, который я хочу прочитать только в желаемом значении диапазона, Заранее спасибо.

1 Ответ

0 голосов
/ 15 июня 2019

Я думаю, что в вашей онтологии что-то не так.

Задание кратных диапазонов для вашего предиката создает пересечение .Возьмем следующее утверждение:

?star ns:possesses ?something

Тогда ?something будет SpectralType и a StarTemperature и a StarCoordinates и a StarName в то же время, а это не то, что вам нужно.

Вместо этого вы должны использовать союзы.Используя союзы, вы можете утверждать, что объект оператора ns:possesses может быть SpectralType или a StarTemperature или a StarCoordinates или а StarName.Затем в своем запросе SPARQL вы можете написать следующее, чтобы получить только операторы одного типа.

SELECT * WHERE {
    ns:star1086 ns:possesses ?z .
    ?z a ns:SpectralType .
}

В Protégé, чтобы написать объединение, откройте редактор выражений классов (нажав на «плюс»рядом с "Диапазоны", например) и разделите различные элементы с помощью or:

SpectralType or StarTemperature or StarCoordinates or StarName

и нажмите "ОК", чтобы создать новый диапазон.


Дополнительные соображения

Давайте сделаем шаг назад и посмотрим на вашу онтологию.

Вы не должны использовать один предикат для хранения всей этой информации.Вместо этого я предлагаю вам использовать разные предикаты, чтобы ваши графики и запросы содержали больше семантических значений.

Кроме того, StarName и Temperature являются буквальными значениями.Вы не должны использовать классы для этого.Вместо этого используйте свойства типа данных.

Здесь - это Gist, который вы можете загрузить и открыть в Protégé.Он содержит некоторые примеры данных, поэтому вы можете попробовать следующие запросы SPARQL.

PREFIX : <http://www.richarddegenne.com/ontology/astronomy#>

# Get all statements about :star1086
SELECT * WHERE {
  :star1086 ?predicate ?object
}

# Get some statement about :star1086
SELECT * WHERE {
  VALUES ?predicate {
    :hasSpectralType :temperate
  }
  :star1086 ?predicate ?object
}

# Ask whether a given pattern is true
ASK WHERE {
  :star1086 :hasSpectralType :yellowDwarf
}

# Filter stars based on their temperature
# Note: You might want to add more stars with different temperature
#       if you want useful results.
SELECT ?star WHERE {
  ?star :temperature ?temperature
  FILTER(?temperature > 5000)
}
...