#if-statement #sparql #optional #not-exists
#if-statement #sparql #необязательно #не существует
Вопрос:
Надеюсь, у вас все хорошо. Вот базовая структура моей графической базы данных. Компоненты имеют методы оценки, методы оценки имеют параметры, а параметры имеют источники данных.
c -> em -> p -> ds
Где,
c stands for components
em stands for estimation methods
p stands for parameters
ds stands for data sources
Я могу запрашивать людей в структурированном формате, подобном этому:
SELECT ?c ?em ?p ?ds WHERE {
?c wb:hasEstimationMethod ?em.
OPTIONAL {
?em wb:hasParameter ?p.
OPTIONAL{
?p wb:hasDataSource ?ds.
}
}
}
Я использую НЕОБЯЗАТЕЛЬНОЕ предложение, потому что существует вероятность того, что метод оценки может не иметь никаких параметров, и аналогичные параметры могут не иметь никаких источников данных.
Однако есть несколько случаев, когда, например, метод оценки неизвестен, но мы знаем параметр. Так, например, в этом случае компоненты будут напрямую иметь параметры, и я бы предпочел иметь пробел для методов оценки. Итак, вот результат, который я хотел бы иметь,
c | em | p | дс |
---|---|---|---|
компонент-1 | метод оценки-1 | параметр-1 | источник данных-1 |
компонент-2 | параметр-2 | источник данных-2 | |
компонент-3 | параметр-3 |
Если вы заметили, что в последних двух строках отсутствует информация, которую я хочу иметь в своем выводе, если это так. Другими словами, я хочу пропустить шаг в иерархической структуре.
Итак, мой вопрос в том, как я могу сначала запросить ?c wb:hasEstimationMethod ?em
, но если он не имеет никакого значения, я хочу сказать SPARQL использовать query ?c wb:hasParameter ?p
и аналогично, если это тоже не имеет значения, сделать ?c wb:hasDataSource ?ds
?
Любая помощь будет принята с благодарностью! Пожалуйста, дайте мне знать, если я не использую правильную терминологию. Хорошего дня 🙂
Комментарии:
1. для альтернативных путей, где вам нужны промежуточные узлы, вы должны использовать
UNION
operator .2. было бы неплохо воспроизвести правильные образцы данных.
3. @UninformedUser привет, спасибо за ваш ответ, извините, это мой первый вопрос о переполнении стека, как я могу добавить образец данных к моему вопросу, к которому люди могут получить доступ? Есть ли способ использовать альтернативный путь с использованием оператора ОБЪЕДИНЕНИЯ, только если обычный путь не возвращает значения? Спасибо за ваше время!
4. что вы подразумеваете под «только если»? Второй альтернативой будет совершенно другой шаблон или нет? Like
{?c a wb:component . ?c ?c wb:hasParameter ?p. OPTIONAL{ ?p wb:hasDataSource ?ds. }}
— действительно, это работает, только если вы можете отличить компонент от метода оценки, как я моделировал с помощью typewb:component
— но это что-то хорошее моделирование использует в любом случае5. да, вторая альтернатива — это другой шаблон, но я все равно хочу показать вывод в той же таблице, что и показано выше. Например, для компонента получаем все методы оценки, для метода оценки получаем параметры, а для параметра получаем источники данных. Но существует вероятность того, что параметр напрямую связан с компонентом или источник данных напрямую связан с компонентом. В этом случае я хочу иметь эти промежуточные значения (методы оценки и / или параметры) в качестве пробелов в таблице. И да, у меня есть способ отличить компоненты от методов оценки и так далее.