2

在如下所示的 Wikidata SPARQL 查询中,我希望能够为?placeOfBirthAltLabel.

问题是下面的一些值?placeOfBirthAltLabel包含逗号

例如,“New York”的同义词包括“New York, USA”作为单个条目。

但是,由于返回值是用逗号分隔的,因此该单个条目将被解析为两个单独的字符串。

所以换句话说,我需要返回 [New York, USA ; 纽约; NYC, USA ] 而不是 [New York, USA, NYC, NYC, USA]

SELECT ?item ?itemLabel ?placeOfBirthLabel ?placeOfBirthAltLabel 
WHERE
{
  ?item wdt:P106 wd:Q10833314.
  OPTIONAL { ?item wdt:P19 ?placeOfBirth }

  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

LIMIT 100

谢谢!

4

1 回答 1

1

您不需要解析替代标签。它们的值由标签服务连接。只是不要将标签服务用于替代标签:

SELECT ?item ?itemLabel ?placeLabel ?place_alt_label WHERE { 
    ?item wdt:P106 wd:Q10833314. 
    OPTIONAL { 
        ?item wdt:P19 ?place .
        OPTIONAL {
            ?place skos:altLabel ?place_alt_label .
            FILTER (lang(?place_alt_label)='en')
            }
    }  
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

试试看!

如果您仍想解析...逗号是硬编码的,请改用分组和GROUP_CONCAT自定义分隔符:

SELECT ?item ?itemLabel ?placeLabel
    (GROUP_CONCAT(?place_alt_label; separator='; ') AS ?4) WHERE { 
    ?item wdt:P106 wd:Q10833314. 
    OPTIONAL { 
        ?item wdt:P19 ?place .
        OPTIONAL {
            ?place skos:altLabel ?place_alt_label .
            FILTER (lang(?place_alt_label)='en')
            }
    }  
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
GROUP BY ?item ?itemLabel ?placeLabel

试试看!


小心标签服务预测的变量。例如,

SELECT ?item ?itemLabel ?placeLabel   {...}
GROUP BY ?item ?itemLabel ?placeLabel

应该工作,而

SELECT ?item ?itemLabel (SAMPLE(?placeLabel) AS ?3)   {...}
GROUP BY ?item ?itemLabel

不应该。

于 2018-07-25T19:40:24.330 回答