2

这是一个关于 Sparql 和 Wikidata 的问题。我想制定一个返回实例类型关系的查询,但如果它不可用,则返回它的子类。我试过了:

SELECT DISTINCT  ?ent_type  WHERE { 

 { wd:Q7696957 wdt:P31 ?instanceof . } UNION 
 { wd:Q7696957 wdt:P31/wdt:P279? ?subclass .  } UNION 
 { wd:Q7696957 wdt:P279* ?subclass  . } 

 BIND ( IF (BOUND (?instanceof), ?instanceof, ?subclass ) as ?ent_type  ) 

但不幸的是,这会返回所有解决方案,而我只想要一个解决方案

ent_type
----------
wd:Q811979
wd:Q386724
wd:Q811430
wd:Q7696957
4

2 回答 2

5

您可以使用合并来实现此目的:

select distinct ?ent_type where { 
  optional { wd:Q7696957 wdt:P31 ?direct }
  optional { wd:Q7696957 wdt:P31/wdt:P279? ?indirect }
  optional { wd:Q7696957 wdt:P279* ?ancestor }
  bind(coalesce(?direct, ?indirect, ?ancestor) as ?ent_type)
}
于 2016-04-25T23:12:25.813 回答
2

为了简化 Joshua 的回答,您实际上并不需要合并:

select distinct ?ent_type where { 
  optional { wd:Q7696957 wdt:P31 ?ent_typee . }
  optional { wd:Q7696957 wdt:P31/wdt:P279? ?ent_type . }
  optional { wd:Q7696957 wdt:P279* ?ent_type . }
}

如果有多个具有相同变量名的选项(此处?ent_type),第一个“成功”的选项将绑定该变量。

但是,您的查询逻辑似乎存在问题:如果没有值 for wdt:P31,那么 for 也不存在wdt:P31/wdt:P279?,因此永远不会出现满足中间条件的情况。此外,如果没有值(可能是也可能不是您想要wdt:P279*的),将(因为*)返回资源本身( )。wd:Q7696957wdt:P279

于 2016-04-28T20:31:50.267 回答