如this question所示,它具有相似的标题,我想通过知道其名称的一部分来检索dbpedia资源。当谈到SPARQL等时,我是初学者,但问题中的例子帮助了我很多,因为作者搜索了“罗马尼亚”,并且回答的人用Sparql请求连接他做这项工作。这很好,但这就是事情。
在这个例子中,他们已经“知道”罗马尼亚是一个国家,因此
?c a dbpedia-owl:Country ;
WHERE子句中的。完整的sparql请求
SELECT ?c
WHERE {
?c a dbpedia-owl:Country ;
foaf:name "Romania"@en .
FILTER NOT EXISTS {?c dbpedia-owl:dissolutionYear ?y}
}
但是,这个问题并不能完全满足我们的需求,因此通过名称搜索任何资源,“名称”是资源的实际名称,或者是其中的一部分,无论其名称如何(的rdf:)类型即可。目标是搜索“任何东西”,只知道名称或其中的一部分。
我在问你们这个问题之前我一直在做一些研究,我已经知道“名称的一部分”问题可以通过bif函数来解决(不好的方法,因为它不符合sparql),或者CONTAINS子句,但我找不到任何显示如何使用它的例子。
现在假设在dbpedia资源中搜索“单词”,该单词将是来自某个用户的输入。我们称之为“输入”。
我想,这个请求看起来像是:
SELECT ?something WHERE
{
?something a (dbpedia Resource).
CONTAINS(?something,"INPUT")
}
我的主要问题是两个主要方面:
那么,是否有人知道这个“主查询”通过提供其名称或其中的一部分来获取资源? (一个例子是提供“奥巴马”,并且不仅为巴拉克而且为米歇尔获得结果)。
提前谢谢。
答案 0 :(得分:15)
我假设您在第一个问题中感兴趣的是只关注实例资源。我不知道你是否可以在一般情况下明确询问例如资源,因为在RDF中,一切都是资源。如果您对DBpedia数据集特别需要这个,则可以查询具有dcterms的资源:subject作为属性(在DBPedia中,只有实例资源具有dcterms:subject)。所以你可以这样查询:
SELECT DISTINCT ?s ?label WHERE {
?s rdfs:label ?label .
FILTER (lang(?label) = 'en').
?label bif:contains "Obama" .
?s dcterms:subject ?sub
}
类似于你的第二个问题 - 如果你只使用DBpedia数据集,你可能想要使用" bif:contains"虽然不符合SPARQL。我不认为还有另一种最佳方法可以做到这一点,正如您所说的那样使用FILTER将是次优的,特别是如果您需要快速执行查询。我认为关键字搜索和索引是由每个三重商店临时处理的,还没有一种标准化的方式来访问全文搜索者。
总而言之,如果您使用dbpedia,只需使用商店的功能和数据集的细节来解决您的问题。