使用 SPARQL 从 Wikidata 收集三元组

问题描述 投票:0回答:1

我想从维基数据实体(例如海伦·凯勒)收集三元组(主题、预测、对象)。目前,我有一个疑问如下:

SELECT ?wd ?wdLabel ?ps_Label ?ps_Description WHERE {     
  VALUES (?item) {(wd:Q38203)}    
  ?item ?p ?statement .   
  ?statement ?ps ?ps_ .    
  ?wd wikibase:claim ?p.   
  ?wd wikibase:statementProperty ?ps.   
  SERVICE wikibase:label {          
    bd:serviceParam wikibase:language "en".    
  }         
}

我对此有两个问题:

  1. 看来很多无意义的三元组也会被列出来,比如属性(“CONOR.BG ID”,“爱尔兰国家图书馆ID”)。但我想要的只是关键的三元组。我可以直接过滤它们吗?或者有一个分数可以排名吗?

  2. 上面检索三元组的查询似乎实体充当主体,而不是客体。换句话说,可以检索格式 (Helen Keller, ?, ?),而不是 (?, ?, Helen Keller)。但我打算收集所有三元组,即使它是一个对象实体。

sparql wikidata
1个回答
0
投票
  1. 如果您只想排除标识符,可以添加约束:
FILTER NOT EXISTS {
     ?wd wdt:P31/wdt:P279* wd:Q6545185 .
}

这不包括作为唯一标识符(Q6545185)(Q6545185)

(的子类)实例的所有属性
  1. 我建议您进行另一个查询交换
    ?item
    ?ps_
    。如果您想通过单个查询来实现此目的,您可以替换
   ?item ?p ?statement .
   ?statement ?ps ?ps_ .

   { ?item ?p ?statement .
     ?statement ?ps ?ps_ . }
   UNION
   { ?subj ?p ?statement .
     ?statement ?ps ?item . }

并选择

?subj
以标记引用“反转”关系的元组。

结果查询如下:

SELECT ?subj ?subjLabel ?subjDescription ?wd ?wdLabel ?ps_Label ?ps_Description WHERE {     
  VALUES (?item) {(wd:Q38203)}    
  { ?item ?p ?statement .
    ?statement ?ps ?ps_ . }
  UNION
  { ?subj ?p ?statement .
    ?statement ?ps ?item . }
  ?wd wikibase:claim ?p.   
  ?wd wikibase:statementProperty ?ps.   
  SERVICE wikibase:label {          
    bd:serviceParam wikibase:language "en".    
  }
  FILTER NOT EXISTS {
    ?wd wdt:P31/wdt:P279* wd:Q6545185 .
  }
}
ORDER BY ?subj ?wd
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.