SPARQL - 查找具有最相似属性的对象

时间:2016-04-27 11:04:44

标签: sparql rdf semantic-web linked-data

让我们说有一个人的RDF数据库,每个人都有许多三元组来定义这个人的朋友(很多'person' x:hasFriend 'otherPerson')。如何找到拥有最相似朋友的人?我是SPARQL的新手,这似乎是一个非常复杂的查询。

基本上,结果将是从具有最相似的朋友列表(到查询中指定的人)开始的人的列表,然后沿着列表向下到具有最少相似朋友列表的人。

因此,我想在person1搜索此查询,结果将类似于:

  1. person2 - 300名相同的朋友
  2. person30 - 245位相同的朋友
  3. person18 - 16位相同的朋友

1 个答案:

答案 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.