Запрос SPARQL для получения объектов, связанных с объектом 2, которые не связаны с объектом 1, используя IF или NOT EXISTS или любым другим способом?

#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. }} — действительно, это работает, только если вы можете отличить компонент от метода оценки, как я моделировал с помощью type wb:component — но это что-то хорошее моделирование использует в любом случае

5. да, вторая альтернатива — это другой шаблон, но я все равно хочу показать вывод в той же таблице, что и показано выше. Например, для компонента получаем все методы оценки, для метода оценки получаем параметры, а для параметра получаем источники данных. Но существует вероятность того, что параметр напрямую связан с компонентом или источник данных напрямую связан с компонентом. В этом случае я хочу иметь эти промежуточные значения (методы оценки и / или параметры) в качестве пробелов в таблице. И да, у меня есть способ отличить компоненты от методов оценки и так далее.