如何在另一个sparql查询中进行sparql查询?

时间:2019-05-20 14:07:32

标签: sparql

我正在尝试在另一个sparql查询中进行一个sparql查询。在sql中,我们可以这样做:

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

我想在SPARQL查询中做同样的事情。具体来说,我有两个sparql查询,我想将它们组合在一起。我的最终目标是找到“ Siemens PLM Software Company”的子公司。为此,我首先需要找到公司的ID,然后寻找其子公司。

第一季度:找到“ 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

第二季度:找到“ 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. } 

您知道我该怎么做吗?谢谢!

1 个答案:

答案 0 :(得分:2)

有些事情还不太清楚:

  • 您真的是要将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". }
}

这等效于第一个查询,但运行速度要慢得多,因为查询优化器不能很好地处理子查询。