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

如何在另一个sparql查询中进行sparql查询?,sparql,Sparql,我试图在另一个sparql查询中进行sparql查询。在sql中,我们可以这样做: SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT STATEMENT); SELECT ?Subsidiary ?SubsidiaryLabel ?parent_organization ?parent_organizationLabel WHERE { SERVICE wikibase:label { bd:ser

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

SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);
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. } 
我想在SPARQL查询中做同样的事情。具体来说,我有两个sparql查询,我想将它们组合在一起。我的最终目标是找到西门子PLM软件公司的子公司。为了做到这一点,首先我需要找到该公司的id,然后寻找其子公司

Q1:找到“西门子PLM软件公司”的唯一标识

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". }
}
 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. }   
  • 返回Q15898201
问题2:寻找“西门子PLM软件公司”的子公司

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". }
}
 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 column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);
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
    作为一个文本的值。我想你的意思是只返回
    ?文章
  • 看来你的上级组织关系倒过来了?您的第二季度需要西门子PLM软件的子公司。没有。要请求西门子,您需要请求

    wd:Q15898201 wdt:P749 ?parent_organization
    
    而不是

    ?Subsidiary wdt:P749 wd:Q15898201
    
这样一来,这里就不需要子查询了。只需写出所需图形结构的图形模式,对可能不存在的部分使用
可选
,并确保变量名称在整个查询过程中正确匹配,即可实现查询:

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

这相当于第一个查询,但运行速度要慢得多,因为查询优化程序不太擅长处理子查询。

我不明白为什么要使用子查询?为什么不合并两个查询的三重模式呢?我的意思是,最终它将是一个连接,这里不需要更多。这里不需要子查询,我使用了@cygri的答案,它可以工作!非常感谢您的帮助,我是sparql的新手,仍在努力了解它是如何工作的。这对我来说真的很有用。