我无法让可选标记返回某些属性可能不存在的行。例如,在以下查询中,我返回有关MMA战斗机Lyoto Machida http://goo.gl/cWFk9N
的一些信息SELECT ?surname ?givenName ?nick ?height ?born ?nationality ?birthplace
where {
<http://dbpedia.org/resource/Lyoto_Machida>
foaf:surname ?surname ;
foaf:givenName ?givenName ;
dbp:otherNames ?nick ;
dbo:height ?height ;
dbp:birthDate ?born ;
dbp:nationality ?nationality ;
dbp:birthPlace ?birthplace
}
现在,如果我想使用相同的查询,除了MMA战斗机Luke Rockhold,我没有得到任何结果。这是因为他没有列出国籍或其他姓名。所以我尝试在我的所有属性周围使用可选标签,但这仍然没有用。
SELECT ?surname ?givenName ?nick ?height ?born ?nationality ?birthplace
where {
<http://dbpedia.org/resource/Luke_Rockhold>
OPTIONAL {foaf:surname ?surname ;}
OPTIONAL {foaf:givenName ?givenName ;}
OPTIONAL {dbp:otherNames ?nick ;}
OPTIONAL {dbo:height ?height ;}
OPTIONAL {dbp:birthDate ?born ;}
OPTIONAL {dbp:nationality ?nationality ; }
OPTIONAL {dbp:birthPlace ?birthplace }
}
我的语法或逻辑是否有错误?我是使用sparql和dbpedia的新手,非常感谢任何帮助
答案 0 :(得分:0)
您不能将OPTIONAL
这样的单个模式拆分。 OPTIONAL
内外的部分必须是有效的模式。一种方法是使用BIND
:
SELECT ?surname ?givenName ?nick ?height ?born ?nationality ?birthplace
WHERE {
BIND(:Luke_Rockhold AS ?x)
OPTIONAL {?x foaf:surname ?surname}
OPTIONAL {?x foaf:givenName ?givenName}
OPTIONAL {?x dbp:otherNames ?nick}
OPTIONAL {?x dbo:height ?height}
OPTIONAL {?x dbp:birthDate ?born}
OPTIONAL {?x dbp:nationality ?nationality}
OPTIONAL {?x dbp:birthPlace ?birthplace}
}