Я думаю, что в вашей онтологии что-то не так.
Задание кратных диапазонов для вашего предиката создает пересечение .Возьмем следующее утверждение:
?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)
}