如何在另一个 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,然后寻找其子公司。
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". }
}
- ReturnsQ15898201
Q2:查找'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. }
- Returns西门子
我想把它们组合成这样:
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. }
你知道我该怎么做吗?谢谢!
有几点不太清楚:
- 您的意思是 return
rdfs:label
属性 为 ?label
?我不明白你为什么要这样做,所以我假设你的意思是直接匹配 rdfs:label
属性 而不 returning 它
- 为什么 return
?articleLabel
?它无论如何都不是真正的标签,而只是 ?label
的值作为文字。我假设你的意思只是 return ?article
.
你的上级组织关系好像反了?您的 Q2 需要 Siemens PLM Software 的子公司。 None 存在。求西门子需要求
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". }
}
这相当于第一个查询,但运行速度要慢得多,因为查询优化器不擅长处理子查询。
我正在尝试在另一个 sparql 查询中创建一个 sparql 查询。在sql中,我们可以这样做:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);
我想在 SPARQL 查询中做同样的事情。具体来说,我有两个 sparql 查询,我想将它们组合在一起。我的最终目标是找到 'Siemens PLM Software Company' 的子公司。为此,首先我需要找到公司的 ID,然后寻找其子公司。
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". }
}
- ReturnsQ15898201
Q2:查找'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. }
- Returns西门子
我想把它们组合成这样:
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. }
你知道我该怎么做吗?谢谢!
有几点不太清楚:
- 您的意思是 return
rdfs:label
属性 为?label
?我不明白你为什么要这样做,所以我假设你的意思是直接匹配rdfs:label
属性 而不 returning 它 - 为什么 return
?articleLabel
?它无论如何都不是真正的标签,而只是?label
的值作为文字。我假设你的意思只是 return?article
. 你的上级组织关系好像反了?您的 Q2 需要 Siemens PLM Software 的子公司。 None 存在。求西门子需要求
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". }
}
这相当于第一个查询,但运行速度要慢得多,因为查询优化器不擅长处理子查询。