首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在另一个sparql查询中生成sparql查询?

如何在另一个sparql查询中生成sparql查询?
EN

Stack Overflow用户
提问于 2019-05-20 14:07:31
回答 1查看 67关注 0票数 1

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

代码语言:javascript
复制
SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);

我想在SPARQL查询中做同样的事情。具体来说,我有两个sparql查询,我想将它们组合在一起。我的最终目标是找到‘西门子PLM软件公司的子公司。为了做到这一点,我首先需要找到公司的id,然后寻找它的子公司。

Q1:找到“西门子PLM软件公司”的独特身份

代码语言:javascript
复制
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:寻找西门子PLM软件公司的子公司

代码语言:javascript
复制
 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. }   
  • 返回西门子

我想把它们结合在一起,如下所示:

代码语言:javascript
复制
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. } 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-21 15:03:37

有几件事不太清楚:

  • 您真的打算将rdfs:label属性返回为?label吗?我不明白您为什么要这样做,所以我假设您打算直接在rdfs:label属性上匹配而不返回它
  • 为什么还回?articleLabel?无论如何,它不是真正的标签,而是?label作为文字的值。我想你是想把?article还给我。
  • 似乎你的父母组织关系倒转了?您的Q2要求西门子PLM软件的子公司。根本不存在。要想要西门子,你需要要求 wd:Q 15898201 wdt:P 749 ?parent_organization 而不是 ?附属wdt:P 749 wd:Q 15898201

这样就不需要在这里进行子查询了。只需为所需的图形结构写出图形模式,对可能不存在的部分使用OPTIONAL,并确保变量名在整个查询过程中正确匹配,就可以实现查询:

代码语言:javascript
复制
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". }
}

尽管如此,如果您确实希望使用子查询,则可以使用:

代码语言:javascript
复制
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". }
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56222664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档