0

我想编写一个 SPARQL 查询,该查询将根据姓名在 Wikidata 上的排名返回一个人的名字。

例如,假设我想要 Mozart (Chrysostom) 的第二个名字。

这是我到目前为止所拥有的(莫扎特维基数据 ID 是 Q254,名字的属性是 P735,P1545 给出了名字的序数位置):

  SELECT DISTINCT ?full_name ?full_nameLabel ?first_nameLabel ?rank 
    WHERE
                      {
                        VALUES ?full_name {wd:Q254} .
                        ?full_name p:P735 [pq:P1545 ?rank] ;
                        p:P735 [ps:P735 ?first_name] ; 
                        FILTER regex(?rank, "2")
                        SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
                      }

但是,这里的过滤器仅适用于rank变量,而不适用于first_name变量:

查询结果:

查询结果

我认为问题出在rank属性是属性的子元素这一事实first_name。您知道按变量过滤first_name变量的方法rank吗?

4

1 回答 1

0
SELECT DISTINCT ?id ?idLabel ?first_nameLabel ?rank
    WHERE {
        VALUES ?id {wd:Q254} .
        ?id p:P735 [
            pq:P1545 ?rank; 
            ps:P735 ?first_name
        ] 
        FILTER(?rank = "2")
        SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }           
    }
于 2021-11-07T19:30:20.160 回答