我正在尝试使用SPARQL识别事物之间的概念重叠。
以电影为例(LinkedMDB数据),如果我有一部电影,“The Matrix”,我的目标是列出与该电影相似的电影,我可能会先做以下几点:
然后使用我在矩阵中识别的东西,我会查询具有这些属性的东西(伪查询)
SELECT movie, genre, director, location, actors
WHERE {
genre is action or sci-fi .
director are the Wachowski brothers .
location is set in a big city .
OPTIONAL( actors were in the matrix . )
}
SPARQL中是否有允许我检查不同节点之间属性重叠的内容?或者必须像我提议的那样手动完成?
答案 0 :(得分:11)
听起来你要求的是
select ?similarMovie ?genre ?director ?location ?actor where {
values ?movie { <http://.../TheMatrix> }
?genre ^:hasGenre ?movie, ?similarMovie .
?director ^:hasDirectory ?movie, ?similarMovie .
?location ^:hasLocation ?movie, ?similarMovie .
optional { ?actor ^:hasActor ?movie, ?similarMovie .
}
使用向后路径表示法^
和对象列表使其比以下更短:
select ?similarMovie ?genre ?director ?location ?actor where {
values ?movie { <http://.../TheMatrix> }
?movie :hasGenre ?genre .
?movie :hasDirector ?director .
?movie :hasLocation ?location .
?similarMovie :hasGenre ?genre .
?similarMovie :hasDirector ?director .
?similarMovie :hasLocation ?location .
optional {
?movie :hasActor ?actor .
?similarMovie :hasActor ?actor .
}
}
例如,使用DBpedia,我们可以获得与The Matrix有相同经销商和电影摄影师的其他电影:
select ?similar ?cinematographer ?distributor where {
values ?movie { dbpedia:The_Matrix }
?cinematographer ^dbpprop:cinematography ?movie, ?similar .
?distributor ^dbpprop:distributor ?movie, ?similar .
}
limit 10
结果都属于同一特许经营权;你得到:黑客帝国,矩阵重装,矩阵革命,黑客帝国(特许经营)和终极矩阵集。
也可以要求至少具有一些共同属性的东西。两件事物在被认为是相似之前需要有多少属性,这显然是主观的,取决于具体的数据,需要一些实验。例如,我们可以要求DBpedia上的Films至少有35个与Matrix相同的属性,并带有如下查询:
select ?similar where {
values ?movie { dbpedia:The_Matrix }
?similar ?p ?o ; a dbpedia-owl:Film .
?movie ?p ?o .
}
group by ?similar ?movie
having count(?p) > 35
这会拍摄13部电影(包括黑客和其他电影):
使用这种方法,您甚至可以使用常用属性的数量作为相似性的度量。例如:
select ?similar (count(?p) as ?similarity) where {
values ?movie { dbpedia:The_Matrix }
?similar ?p ?o ; a dbpedia-owl:Film .
?movie ?p ?o .
}
group by ?similar ?movie
having count(?p) > 35
order by desc(?similarity)
The Matrix 206
The Matrix Revolutions 63
The Matrix Reloaded 60
The Matrix (franchise) 55
Demolition Man (film) 41
Speed Racer (film) 40
V for Vendetta (film) 38
The Invasion (film) 38
The Postman (film) 36
Executive Decision 36
Freejack 36
Exit Wounds 36
Outbreak (film) 36
答案 1 :(得分:0)
有了DBpedia中的新前缀,Joshua Taylor的答案将是:
select ?similar (count(?p) as ?similarity) where {
values ?movie { dbr:The_Matrix }
?similar ?p ?o ; a dbo:Film .
?movie ?p ?o .
}
group by ?similar ?movie
having (count(?p) > 35)
order by desc(?similarity)