我想确定DBPedia和Yago中任何资源的最相关属性/谓词(不是对象)(例如前20名)。例如,对于音乐艺术家而言,您会对他的年龄,流派,音乐标签,唱片等感兴趣。
一个好的算法应该是什么样才能解决这个问题? 我目前的天真方法如下。
首先,我按照“大小”排序所有课程。 (警告,非常昂贵的查询!)
SELECT distinct ?class (count(distinct ?e) as ?c)
WHERE {
?e rdf:type ?class .
}
ORDER BY DESC(?c)
然后我对每个类进行查询,以获得该类中具有该特定属性的实体数。
SELECT distinct ?prop (count(distinct ?e) as ?c)
WHERE {
?e rdf:type <--CLASS--> .
?e ?prop []
}
ORDER BY DESC(?c)
<--CLASS-->
由相应类的URI替换。经过一些后期处理后,这给我一个这样的列表:
"dbo:Agent": {
"count": 1974654,
"properties": {
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": 399948,
"http://www.w3.org/2002/07/owl#sameAs": 67799,
"dbp:name": 22272,
"dbp:hasPhotoCollection": 13122,
"http://xmlns.com/foaf/0.1/givenName": 10799,
"dbo:birthPlace": 10055,
"dbo:birthDate": 9953,
"dbo:birthYear": 9735
}
},
"dbo:Person": {
count:
...
它告诉我,哪些属性与哪个类最相关。当然,在后面的步骤中应该忽略像http://www.w3.org/2002/07/owl#sameAs
这样的“元”属性。
但是,实体属于多个类,可能每个实体都很重要,并提供其他信息。例如。在dbr:John_Lennon
和dbo:Person
中dbo:MusicalArtist
是(等等)。我需要结合这些类的属性排名。我想到了以下方法,但我不确定这是否真的是一个合理的解决方案。
所以我的想法是通过除以 classA 中的实体数量来计算每个属性的相对权重(例如 propA 在 classA 中)按 classA 中的属性总数 propX 。如果我想合并两个类,那么,例如 classA 和 classB (或 Person 和 MusicalArtist ),我只是将两个类的属性组合在一起,按其相对权重排序(这是一个合法的比较?)。如果两个类中都有属性,我会计算两者的调和均值。
假设上述步骤实际上有意义(请告诉我你的想法),我还有一个问题。我想要结合来自DBPedia和Yago的信息,因此对于dbr:John_Lennon
我想从Yago获取等效的(owl:sameAs
)yr:John_Lennon
。如何合并两个数据集中的属性排名,最终得到包含DBP和Yago属性组合的前20个最相关属性的列表?