Sparql 将多个结果折叠为一个

Sparql 将多个结果折叠为一个,sparql,wikidata,Sparql,Wikidata,我有以下Wikidata SPARQL查询: SELECT ?game ?gameLabel ?enwiki ?genreLabel ?devLabel ?publisherLabel ?platformLabel ?dateYear WHERE { ?game wdt:P31 wd:Q7889; wdt:P136 wd:Q744038. OPTIONAL { ?enwiki schema:about ?game; schema:isPartOf

我有以下Wikidata SPARQL查询:

SELECT ?game ?gameLabel ?enwiki ?genreLabel ?devLabel ?publisherLabel ?platformLabel ?dateYear WHERE {
    ?game wdt:P31 wd:Q7889;
    wdt:P136 wd:Q744038.
    OPTIONAL {
      ?enwiki schema:about ?game;
      schema:isPartOf <https://en.wikipedia.org/>
    }
    OPTIONAL {?game wdt:P136 ?genre}
    OPTIONAL {?game wdt:P178 ?dev}
    OPTIONAL {?game wdt:P123 ?publisher}
    OPTIONAL {?game wdt:P400 ?platform}
    OPTIONAL {
      ?game wdt:P577 ?date;
      BIND( year(?date) as ?dateYear )
    }
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} ORDER BY ASC (?dateYear) asc(?gameLabel)
但是,propset字段始终为空

[编辑]

我成功地实现了分组功能:

SELECT
  ?game
  (group_concat(distinct ?genreLabel ; separator = ",") AS ?genreLabels)
  WHERE {
    ?game wdt:P31 wd:Q7889;
    wdt:P136 wd:Q744038.
    OPTIONAL {
      ?game wdt:P136 ?genre.
      ?genre rdfs:label ?genreLabel.
    }
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} group by $game
ORDER BY ASC (?dateYear) ASC (?gameLabel)
但是,我希望脚本只返回英文结果,但是
服务
行不再起作用

[编辑]

我在其他地方得到了一些帮助,下面是工作脚本:

SELECT
  ?game
  (group_concat(distinct         ?enwiki ; separator = ", ") AS         ?enwikis)
  (group_concat(distinct      ?gameLabel ; separator = ", ") AS      ?gameLabels)
  (group_concat(distinct     ?genreLabel ; separator = ", ") AS     ?genreLabels)
  (group_concat(distinct ?developerLabel ; separator = ", ") AS ?developerLabels)
  (group_concat(distinct ?publisherLabel ; separator = ", ") AS ?publisherLabels)
  (group_concat(distinct  ?platformLabel ; separator = ", ") AS  ?platformLabels)
  (group_concat(distinct       ?dateYear ; separator = ", ") AS       ?dateYears)
  WHERE {
    ?game wdt:P31 wd:Q7889;
    wdt:P136 wd:Q744038.
    OPTIONAL {
      ?enwiki schema:about ?game;
      schema:isPartOf <https://en.wikipedia.org/>
    }
    OPTIONAL {?game wdt:P136     ?genre}
    OPTIONAL {?game wdt:P178 ?developer}
    OPTIONAL {?game wdt:P123 ?publisher}
    OPTIONAL {?game wdt:P400  ?platform}
    OPTIONAL {
      ?game wdt:P577 ?date;
      BIND( year(?date) as ?dateYear )
    }
    SERVICE wikibase:label {
      bd:serviceParam wikibase:language "en".
           ?game rdfs:label      ?gameLabel.
          ?genre rdfs:label     ?genreLabel.
      ?developer rdfs:label ?developerLabel.
      ?publisher rdfs:label ?publisherLabel.
       ?platform rdfs:label  ?platformLabel.
    }
} GROUP BY $game
ORDER BY ASC (?dateYear) ASC (?gameLabel)
选择
游戏
(组_concat(不同的enwiki;分隔符=“,”)作为enwiki)
(组_concat(不同的游戏标签;分隔符=“,”)作为游戏标签)
(组_concat(不同的genreLabel;分隔符=“,”)作为genreLabel)
(组_concat(不同的developerLabel;分隔符=“,”)作为developerLabel)
(组_concat(不同的?publisherLabel;分隔符=“,”)作为?publisherLabel)
(组_concat(不同的平台标签;分隔符=“,”)作为平台标签)
(组_concat(不同的日期年;分隔符=“,”)作为日期年)
在哪里{
?游戏wdt:P31 wd:Q7889;
wdt:P136 wd:Q744038。
可选的{
?enwiki模式:关于?游戏;
模式:isPartOf
}
可选{游戏wdt:P136?流派}
可选{?游戏wdt:P178?开发者}
可选{游戏wdt:P123?发行商}
可选{游戏wdt:P400?平台}
可选的{
?游戏wdt:P577?日期;
绑定(年(?日期)为?日期年)
}
服务维基库:标签{
bd:serviceParam wikibase:language“en”。
?游戏rdfs:标签?游戏标签。
?类型RDF:标签?genreLabel。
?开发者rdfs:标签?开发者标签。
?发布者rdfs:标签?发布者标签。
?平台rdfs:标签?平台标签。
}
}按$game分组
按ASC(?日期年)ASC(?游戏标签)订购

我仍然想知道如何处理一些东西,但会开始一个新问题。

您的解决方案是正确的,但它不适用于Wikidata label服务器,因为这是一些特殊的非标准SPARQL功能。如果您尝试对平台等进行相同的查询,它会起作用。是的,如果我将
?gameLabel
更改为
?game
,它会起作用。我不知道为什么它不喜欢标签(它们是由软件自动创建的)。是的,这是一种非标准的SPARQL方式,因此,它可能不会在查询中执行,而是在查询之后通过相应的标签(如果存在)简单地扩展变量值。我能够使用
rdfs:label
,让标签工作,但是脚本会返回每种语言的结果。我只想要英语成绩。
服务
行应该限制结果,但它没有发生。不,正如我所说,
服务
是Blazegraph triple store的一些特殊功能。您现在所做的是标准的SPARQL方式,例如,您必须通过
filter(LANGMATCHES(LANG(?genreLabel),“en”)
SELECT
  ?game
  (group_concat(distinct         ?enwiki ; separator = ", ") AS         ?enwikis)
  (group_concat(distinct      ?gameLabel ; separator = ", ") AS      ?gameLabels)
  (group_concat(distinct     ?genreLabel ; separator = ", ") AS     ?genreLabels)
  (group_concat(distinct ?developerLabel ; separator = ", ") AS ?developerLabels)
  (group_concat(distinct ?publisherLabel ; separator = ", ") AS ?publisherLabels)
  (group_concat(distinct  ?platformLabel ; separator = ", ") AS  ?platformLabels)
  (group_concat(distinct       ?dateYear ; separator = ", ") AS       ?dateYears)
  WHERE {
    ?game wdt:P31 wd:Q7889;
    wdt:P136 wd:Q744038.
    OPTIONAL {
      ?enwiki schema:about ?game;
      schema:isPartOf <https://en.wikipedia.org/>
    }
    OPTIONAL {?game wdt:P136     ?genre}
    OPTIONAL {?game wdt:P178 ?developer}
    OPTIONAL {?game wdt:P123 ?publisher}
    OPTIONAL {?game wdt:P400  ?platform}
    OPTIONAL {
      ?game wdt:P577 ?date;
      BIND( year(?date) as ?dateYear )
    }
    SERVICE wikibase:label {
      bd:serviceParam wikibase:language "en".
           ?game rdfs:label      ?gameLabel.
          ?genre rdfs:label     ?genreLabel.
      ?developer rdfs:label ?developerLabel.
      ?publisher rdfs:label ?publisherLabel.
       ?platform rdfs:label  ?platformLabel.
    }
} GROUP BY $game
ORDER BY ASC (?dateYear) ASC (?gameLabel)