Sparql Can';当DBpedia中有多部电影同名时,无法获取给定电影标题的演员名称

Sparql Can';当DBpedia中有多部电影同名时,无法获取给定电影标题的演员名称,sparql,Sparql,我试图通过sparql查询获得给定电影标题的演员姓名(我手头上也有发布日期),但考虑到多部电影具有相同名称的情况,我试图用发布日期来区分它们。有些电影没有指定发行日期,有些电影没有指定标签 我试图在发布日期指定且匹配时,或者在电影标签中指定且匹配时获得结果。 如果我不能将日期与这些属性之一匹配,我不希望返回任何结果 以下是我当前的查询: PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX xsd: <http://www.

我试图通过sparql查询获得给定电影标题的演员姓名(我手头上也有发布日期),但考虑到多部电影具有相同名称的情况,我试图用发布日期来区分它们。有些电影没有指定发行日期,有些电影没有指定标签

我试图在发布日期指定且匹配时,或者在电影标签中指定且匹配时获得结果。 如果我不能将日期与这些属性之一匹配,我不希望返回任何结果

以下是我当前的查询:

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都有推理功能,推理功能可以帮助处理各种情况(消除歧义、同一事物的多个属性等)

非常感谢,您为我的项目救了我!我很高兴这有帮助。