0

我正在尝试获取 Wikidata 中实体的外部标识符。使用以下查询,我可以在 Wikidata 查询服务站点上获取 Q2409的文字值 ( _value) 和可选格式的 URL ( )。value

加载维基数据查询服务

SELECT ?property ?_value ?value
WHERE {
  ?property wikibase:propertyType wikibase:ExternalId .
  ?property wikibase:directClaim ?propertyclaim .
  OPTIONAL { ?property wdt:P1630 ?formatterURL . }
  wd:Q2409 ?propertyclaim ?_value .
  BIND(IF(BOUND(?formatterURL), IRI(REPLACE(?formatterURL, "\\$", ?_value)) , ?_value) AS ?value)
}

使用 RDFLib,我正在编写相同的查询,但使用联合服务。

from rdflib import Graph
from rdflib.plugins.sparql import prepareQuery

g = Graph()
q = prepareQuery(r"""
  PREFIX wd: <http://www.wikidata.org/entity/>
  PREFIX wdt: <http://www.wikidata.org/prop/direct/>
  PREFIX wikibase: <http://wikiba.se/ontology#>

  SELECT ?property ?_value ?value
  WHERE {
    SERVICE <https://query.wikidata.org/sparql> {
      ?property wikibase:propertyType wikibase:ExternalId .
      ?property wikibase:directClaim ?propertyclaim .
      OPTIONAL { ?property wdt:P1630 ?formatterURL . }
      wd:Q2409 ?propertyclaim ?_value .
      BIND(IF(BOUND(?formatterURL), IRI(REPLACE(?formatterURL, "\\$", ?_value)) , ?_value) AS ?value)
    }
  }
""")

for row in g.query(q, DEBUG=True):
  print(row)

有了这个,我将 URL 作为URIRef对象。但是,Literal我得到的不是文字值,而是None.

前 6 行输出:

(rdflib.term.URIRef('http://www.wikidata.org/entity/P232'), None, None)
(rdflib.term.URIRef('http://www.wikidata.org/entity/P657'), None, None)
(rdflib.term.URIRef('http://www.wikidata.org/entity/P6366'), None, None)
(rdflib.term.URIRef('http://www.wikidata.org/entity/P1296'), None, rdflib.term.URIRef('https://www.enciclopedia.cat/EC-GEC-01407541.xml'))
(rdflib.term.URIRef('http://www.wikidata.org/entity/P486'), None, rdflib.term.URIRef('https://id.nlm.nih.gov/mesh/D0068511.html'))
(rdflib.term.URIRef('http://www.wikidata.org/entity/P7033'), None, rdflib.term.URIRef('http://vocabulary.curriculum.edu.au/scot/5001.html'))

对于文字值,我缺少什么?我无法弄清楚为什么我得到None而不是价值。

4

1 回答 1

0

我不确定SERVICE调用的所有功能是否都在 RDFLib 中完全实现。

我将使用 RDFLib 的SPARQLWrapper库或通用 Web 请求 Python 库requestshttpx首先使用 Wikidata SPARQL 端点进行“正常”调用。如果一切正常,您可以再次尝试SERVICE请求,但您可能不需要它。

于 2022-02-17T06:47:18.233 回答