Как сделать запрос sparql внутри другого запроса sparql? - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь сделать запрос sparql внутри другого запроса sparql.В SQL мы можем сделать это следующим образом:

SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);

Я хочу сделать то же самое в запросе SPARQL.В частности, у меня есть два запроса sparql, и я хочу объединить их вместе.Моя конечная цель - найти дочерние компании Siemens PLM Software.Для этого сначала нужно найти идентификатор компании, а затем искать ее дочерние компании.

Q1: Находит уникальную личность «Siemens PLM Software Company»

SELECT DISTINCT ?item ?label ?articleLabel  WHERE {
  ?item ?label "Siemens PLM Software"@en;
    wdt:P31 wd:Q4830453.
  ?article schema:about ?item;
    schema:inLanguage "en".
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
  • Возвращает Q15898201

Q2: Найти дочернюю компанию «SiemensPLM Software Company '

 SELECT ?Subsidiary ?SubsidiaryLabel ?parent_organization ?parent_organizationLabel WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  ?Subsidiary wdt:P749 wd:Q15898201.
  OPTIONAL { ?Subsidiary wdt:P749 ?parent_organization. }   
  • Возвращает Siemens

Я хотел бы объединить их во что-то вроде этого:

SELECT ?Subsidiary ?SubsidiaryLabel ?parent_organization ?parent_organizationLabel WHERE {
      SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
      ?Subsidiary wdt:P749 wd:
{SELECT DISTINCT ?item ?label ?articleLabel  WHERE {
      ?item ?label "Siemens PLM Software"@en;
        wdt:P31 wd:Q4830453.
      ?article schema:about ?item;
        schema:inLanguage "en".
      SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    }
}.
      OPTIONAL { ?Subsidiary wdt:P749 ?parent_organization. } 

У васЕсть идеи, как я могу это сделать?Спасибо!

1 Ответ

2 голосов
/ 21 мая 2019

Было несколько неясных вещей:

  • Вы действительно хотели вернуть свойство rdfs:label как ?label?Я не понимаю, почему вы хотите это сделать, поэтому я предполагаю, что вы просто хотите напрямую сопоставить свойство rdfs:label, не возвращая его
  • Зачем возвращать ?articleLabel?В любом случае, это не настоящий лейбл, а просто значение ?label как литерала.Я предполагаю, что вы хотите просто вернуть ?article.
  • Кажется, у вас есть отношения с родительской организацией в обратном направлении?Ваш Q2 просит дочерние компании Siemens PLM Software.Ни один не существует.Чтобы запросить Siemens, вам нужно запросить

    wd:Q15898201 wdt:P749 ?parent_organization
    

    , а не

    ?Subsidiary wdt:P749 wd:Q15898201
    

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

SELECT ?item ?itemLabel ?parent_organization ?parent_organizationLabel WHERE {

  # Find business by label
  ?item rdfs:label "Siemens PLM Software"@en;
    wdt:P31 wd:Q4830453.

  # Find English-language articles about the business
  ?article schema:about ?item;
    schema:inLanguage "en".

  # Find the business' parent organization, if one exists
  OPTIONAL { ?item wdt:P749 ?parent_organization. }   

  # For any variable ?xxx, add variable ?xxxLabel with the label
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

При этом вы можете использовать подзапрос, если действительно хотите:

SELECT ?item ?itemLabel ?parent_organization ?parent_organizationLabel WHERE {
  {
    SELECT ?item {
      ?item rdfs:label "Siemens PLM Software"@en;
      wdt:P31 wd:Q4830453.
    }
  }
  ?article schema:about ?item;
    schema:inLanguage "en".
  OPTIONAL { ?item wdt:P749 ?parent_organization. }   
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

Это эквивалентно первому запросу, но выполняется намного медленнее, поскольку оптимизатор запросов нетак же хорош в обработке подзапросов.

...