Как найти похожий контент с помощью SPARQL
Я играю с идеей использования SPARQL для определения концептуального совпадения между вещами.
Возьмем, к примеру, фильмы (данные LinkedMDB), если у меня есть фильм "Матрица", и моя цель - перечислить фильмы, похожие на этот фильм, я бы, вероятно, начал с выполнения следующих действий:
- Матрица
- получить жанр
- получить актеров
- получить директора
- получить местоположение
- так далее
И затем, используя вещи, которые я определил в матрице, я бы запросил вещи с этими свойствами (псевдопросмотр)
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 что-то, что позволяет мне проверять совпадение свойств между разными узлами? Или это должно быть сделано вручную, как я предложил?
1 ответ
Соответствие некоторым конкретным свойствам
Похоже, вы просите что-то вроде
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
Результаты все в той же франшизы; Вы получаете: Матрица, Матрица: Перезагрузка, Матричные революции, Матрица (франшиза) и Коллекция Ultimate Matrix.
Соответствие хотя бы некоторому количеству свойств
Также можно попросить вещи, которые имеют хотя бы некоторое количество общих свойств. То, сколько свойств должны иметь две общие черты, прежде чем их можно будет считать схожими, очевидно, субъективно, будет зависеть от конкретных данных и потребует некоторых экспериментов. Например, мы можем запросить Films в DBpedia, которые имеют как минимум 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 фильмов (включая Матрицу и другие фильмы в франшизе):
- V для Вендетты (фильм)
- Матрица
- Почтальон (фильм)
- Исполнительное решение
- Вторжение (фильм)
- Разрушитель (фильм)
- Матрица (франшиза)
- Матрица перезагружена
- Freejack
- Сквозные ранения
- Матричные революции
- Вспышка (фильм)
- Speed Racer (фильм)
Используя такой подход, вы даже можете использовать количество общих свойств в качестве меры сходства. Например:
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
С новыми префиксами в DBpedia ответ Джошуа Тейлора будет таким:
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)