Wikidata SPARQL - 配偶开始时间和结束时间的重复结果

Wikidata SPARQL - Duplicate results for spouse start time and end time

我正在尝试构建一个查询 return 演员及其配偶的列表,同时包括每对夫妇的结婚和离婚日期。所以我希望看到每个参与者都与新关系的每个实例重复......但是当我尝试在查询中包含开始时间和结束时间属性时,我得到了重复的结果。我怀疑这是因为配偶的“姓名”和“姓名”存储在不同的维基数据前缀中,我没有正确分组。

这是一个示例查询:

SELECT ?person ?personLabel ?spouse ?spouseLabel ?starttime ?endtime
WHERE
{
  ?person wdt:P106 wd:Q33999, wd:Q2526255, wd:Q28389, wd:Q3282637;
          wdt:P26 ?spouse.
  ?person p:P26 [pq:P580 ?starttime; pq:P582 ?endtime].
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ASC(UCASE(str(?personLabel)))
LIMIT 10

这里是 sparql 交互服务的 link,因此您可以看到我所指的欺骗结果: https://query.wikidata.org/#SELECT%20%3Fperson%20%3FpersonLabel%20%3Fspouse%20%3FspouseLabel%20%3Fstarttime%20%3Fendtime%0AWHERE%0A%7B%0A%20%20%3Fperson%20wdt%3AP106%20wd%3AQ33999%2C%20wd%3AQ2526255%2C%20wd%3AQ28389%2C%20wd%3AQ3282637%3B%0A%20%20%20%20%20%20%20%20%20%20wdt%3AP26%20%3Fspouse.%0A%20%20%3Fperson%20p%3AP26%20%5Bpq%3AP580%20%3Fstarttime%3B%20pq%3AP582%20%3Fendtime%5D.%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22en%22.%20%7D%0A%7D%0AORDER%20BY%20ASC%28UCASE%28str%28%3FpersonLabel%29%29%29%0ALIMIT%2010%0A

screencap of duped results

您查询的问题是配偶和他们的婚姻声明之间没有link。

因此,对于每个演员,您要归还他们的所有配偶,以及他们结婚的所有 start/end 日期,无论他们是否与特定配偶有关。

您需要做的是使用 ps: 命名空间,如下所示:

SELECT ?person ?personLabel ?spouse ?spouseLabel ?starttime ?endtime
    WHERE
    {
      ?person wdt:P106 wd:Q33999, wd:Q2526255, wd:Q28389, wd:Q3282637 .
      ?person p:P26 [ ps:P26 ?spouse ; #This is the necessary change.
                      pq:P580 ?starttime;
                      pq:P582 ?endtime ].
      SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    }
    ORDER BY ASC(?personLabel)
    LIMIT 10

通常,wdt: 命名空间直接用于 linking 实体,p: 命名空间 link 是声明的实体,ps: link 是对实体的声明,pq: 告诉我们关于该声明的一些信息。