Sparql Can';当DBpedia中有多部电影同名时,无法获取给定电影标题的演员名称
我试图通过sparql查询获得给定电影标题的演员姓名(我手头上也有发布日期),但考虑到多部电影具有相同名称的情况,我试图用发布日期来区分它们。有些电影没有指定发行日期,有些电影没有指定标签 我试图在发布日期指定且匹配时,或者在电影标签中指定且匹配时获得结果。 如果我不能将日期与这些属性之一匹配,我不希望返回任何结果 以下是我当前的查询:Sparql Can';当DBpedia中有多部电影同名时,无法获取给定电影标题的演员名称,sparql,Sparql,我试图通过sparql查询获得给定电影标题的演员姓名(我手头上也有发布日期),但考虑到多部电影具有相同名称的情况,我试图用发布日期来区分它们。有些电影没有指定发行日期,有些电影没有指定标签 我试图在发布日期指定且匹配时,或者在电影标签中指定且匹配时获得结果。 如果我不能将日期与这些属性之一匹配,我不希望返回任何结果 以下是我当前的查询: PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX xsd: <http://www.
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?film ?aname
WHERE {
?film a dbo:Film ;
foaf:name "A Nightmare on Elm Street"@en ;
dbo:starring ?a .
?a foaf:name ?aname
OPTIONAL
{ ?film dbo:releaseDate ?rd
BIND(year(xsd:date(?rd)) AS ?rrd)
FILTER ( ( ?rd = "1984-04-30"^^xsd:date ) || ( ?rrd = 1984) )
}
OPTIONAL
{ ?film rdfs:label ?lab
FILTER regex(?lab, "1984", "i")
FILTER ( lang(?lab) = "en" )
}
}
前缀dbo:
前缀xsd:
前缀rdfs:
前缀foaf:
选择不同的?胶片?图像名称
在哪里{
?胶片a dbo:胶片;
foaf:名称为“榆树街上的噩梦”@en;
dbo:主演?a。
一个foaf:名字?阿纳姆
可选的
{?电影dbo:发行日期?rd
绑定(年份(xsd:日期(?rd))为rrd)
过滤器((?rd=“1984-04-30”^^xsd:date)| |(?rrd=1984))
}
可选的
{?胶片rdfs:标签?实验室
过滤正则表达式(?实验室,“1984”,“i”)
过滤器(lang(?lab)=“en”)
}
}
我想你在这里误用了可选的。相反,您应该查看联合体。
有什么区别
SELECT ?person ?child
WHERE {
?person a :Person .
OPTIONAL {?person :hasSon ?child}
OPTIONAL {?person :hasDaughter ?child}
}
将返回每个人,以及他们的儿子/女儿(可选)。然而,这也将返回那些根本没有孩子的人
相反,类似于:
SELECT ?person ?child
WHERE {
?person a :Person .
{?person :hasSon ?child}
UNION
{?person :hasDaughter ?child}
}
只返回至少有一个儿子或女儿的人
现在,在您的示例中,我有一个如下的查询:
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?film ?aname
WHERE {
?film a dbo:Film ;
foaf:name "A Nightmare on Elm Street"@en ;
dbo:starring ?a .
?a foaf:name ?aname
{ ?film dbp:released 1984}
UNION
{ ?film rdfs:label ?lab
FILTER regex(?lab, "1984", "i")
FILTER ( lang(?lab) = "en" )
}
}
前缀dbo:
前缀dbp:
前缀xsd:
前缀rdfs:
前缀foaf:
选择不同的?胶片?图像名称
在哪里{
?胶片a dbo:胶片;
foaf:名称为“榆树街上的噩梦”@en;
dbo:主演?a。
一个foaf:名字?阿纳姆
{?电影dbp:1984年发行}
联合
{?胶片rdfs:标签?实验室
过滤正则表达式(?实验室,“1984”,“i”)
过滤器(lang(?lab)=“en”)
}
}
请注意,我使用了dbp:released
属性,它似乎正在工作
电影中用于发布的属性似乎不一致,即一些使用dbp:released
,其他使用dbo:releaseDate
如果这是一个问题,您当然可以在查询中添加另一个UNION
语句来处理不同的情况
还有一件事:
有很多TripleStore都有推理功能,推理功能可以帮助处理各种情况(消除歧义、同一事物的多个属性等)非常感谢,您为我的项目救了我!我很高兴这有帮助。