让我们说有一个人的RDF数据库,每个人都有许多三元组来定义这个人的朋友(很多'person' x:hasFriend 'otherPerson'
)。如何找到拥有最相似朋友的人?我是SPARQL的新手,这似乎是一个非常复杂的查询。
基本上,结果将是从具有最相似的朋友列表(到查询中指定的人)开始的人的列表,然后沿着列表向下到具有最少相似朋友列表的人。
因此,我想在person1
搜索此查询,结果将类似于:
person2
- 300名相同的朋友person30
- 245位相同的朋友person18
- 16位相同的朋友等
答案 0 :(得分:3)
如果您在我对How to find similar content using SPARQL(其中可能被视为重复)的回答中调整方法,那么您最终会得到以下内容:
select ?otherPerson (count(?friend) as ?numFriends) where {
:person1 :hasFriend ?friend . #-- person1 has a friend, ?friend .
?otherPerson :hasFriend ?friend . #-- so does ?otherPerson .
}
group by ?otherPerson #-- One result row per ?otherPerson,
order by desc(?numFriends) #-- ordered by number of common friends.
如果您真的想要,可以使用反向属性路径使查询模式更短:
select ?otherPerson (count(?friend) as ?numFriends) where {
#-- some ?friend is a friend of both :person1 and ?otherPerson .
?friend ^:hasFriend :person1, ?otherPerson .
}
group by ?otherPerson #-- One result row per ?otherPerson,
order by desc(?numFriends) #-- ordered by number of common friends.