簡體   English   中英

如何在另一個sparql查詢中進行sparql查詢?

[英]How to make a sparql query inside another sparql query?

我試圖在另一個sparql查詢中進行一個sparql查詢。 在sql中,我們可以這樣做:

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

我想在SPARQL查詢中做同樣的事情。 具體來說,我有兩個sparql查詢,我想將它們組合在一起。 我的最終目標是找到“ Siemens PLM Software Company”的子公司。 為此,我首先需要找到公司的ID,然后尋找其子公司。

問題1:查找“ 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

問題2:找到“ Siemens PLM 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. }   
  • 返回西門子

我想將它們組合成這樣的東西:

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. } 

你知道我該怎么做嗎? 謝謝!

有幾件事不太清楚:

  • 您是否真的要將rdfs:label屬性返回為?label 我不明白您為什么要這樣做,所以我假設您的意思是直接匹配rdfs:label屬性而不返回它
  • 為什么要返回?articleLabel 無論如何,它不是真正的標簽,而只是?label的值作為文字。 我想你的意思是只返回?article
  • 看來您的上級組織關系倒退了嗎? 您的第二季度將要求Siemens PLM Software的子公司。 不存在。 要求西門子,您需要

     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". }
}

這等效於第一個查詢,但運行速度要慢得多,因為查詢優化器不能很好地處理子查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM