当多部电影在 DBpedia 中具有相同名称时,无法获取给定电影名称的演员名称
Can't get actor names for a given film title when multiple films have the same name in DBpedia
我正在尝试使用我的 sparql 查询获取给定电影标题的演员姓名(我也有发行日期),但考虑到多部电影同名的情况,我正在尝试区分他们的发布日期。有些电影没有指定上映日期,有些电影没有指定标签。
我正在尝试获取指定发行日期且匹配的结果,或者当它在电影标签中且也匹配时的结果。
如果我无法将日期与这些属性之一相匹配,我不希望 return
中有任何结果
这是我当前的查询:
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" )
}
}
我认为您在这里误用了 OPTIONAL
。相反,您应该查看 UNION
。
有什么区别?
SELECT ?person ?child
WHERE {
?person a :Person .
OPTIONAL {?person :hasSon ?child}
OPTIONAL {?person :hasDaughter ?child}
}
每个人都会 return,并且可以选择 sons/daughters。然而,这 return 也会 完全没有任何 children 的人 。
相反,类似:
SELECT ?person ?child
WHERE {
?person a :Person .
{?person :hasSon ?child}
UNION
{?person :hasDaughter ?child}
}
只会 return 有 至少一个 儿子或女儿的人。
现在,在您的示例中,我有一个这样工作的查询:
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" )
}
}
请注意,我使用了 dbp:released
属性,它似乎有效。
用于发行的 属性 似乎在不同电影中不一致,即有些使用 dbp:released
,有些使用 dbo:releaseDate
.
如果这是一个问题,您当然可以在查询中添加另一个 UNION
语句来处理不同的情况。
还有一件事:
那里有许多具有推理的三元组,推理可以帮助处理各种此类情况(消除歧义、同一事物的多个属性等)
我正在尝试使用我的 sparql 查询获取给定电影标题的演员姓名(我也有发行日期),但考虑到多部电影同名的情况,我正在尝试区分他们的发布日期。有些电影没有指定上映日期,有些电影没有指定标签。
我正在尝试获取指定发行日期且匹配的结果,或者当它在电影标签中且也匹配时的结果。 如果我无法将日期与这些属性之一相匹配,我不希望 return
中有任何结果这是我当前的查询:
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" )
}
}
我认为您在这里误用了 OPTIONAL
。相反,您应该查看 UNION
。
有什么区别?
SELECT ?person ?child
WHERE {
?person a :Person .
OPTIONAL {?person :hasSon ?child}
OPTIONAL {?person :hasDaughter ?child}
}
每个人都会 return,并且可以选择 sons/daughters。然而,这 return 也会 完全没有任何 children 的人 。
相反,类似:
SELECT ?person ?child
WHERE {
?person a :Person .
{?person :hasSon ?child}
UNION
{?person :hasDaughter ?child}
}
只会 return 有 至少一个 儿子或女儿的人。
现在,在您的示例中,我有一个这样工作的查询:
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" )
}
}
请注意,我使用了 dbp:released
属性,它似乎有效。
用于发行的 属性 似乎在不同电影中不一致,即有些使用 dbp:released
,有些使用 dbo:releaseDate
.
如果这是一个问题,您当然可以在查询中添加另一个 UNION
语句来处理不同的情况。
还有一件事: 那里有许多具有推理的三元组,推理可以帮助处理各种此类情况(消除歧义、同一事物的多个属性等)