我想定义与用户兴趣相对应的根类别。然后我需要返回给定根目录下的所有其他潜在兴趣。 我尝试了以下查询,但看起来它进入循环(查询在内部执行)。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.myweb.com/myontology.owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?user ?othercat
WHERE
{
?othercat rdfs:subClassOf ?root .
{
SELECT ?user ?retailcat ?root
WHERE {
?user rdf:type owl:User .
?user owl:hasUserProfile ?userprofile .
?userprofile rdf:type owl:UserProfile .
?userprofile owl:interestedIn ?retailcat .
?entity rdf:type ?type .
?type rdfs:subClassOf* ?retailcat .
?retailcat rdfs:subClassOf ?root .
}
}
}
当我执行子查询时,它工作正常,但它返回用户的当前兴趣,而不提供同一根的其他子概念的信息。
如何解决这个问题?
答案 0 :(得分:0)
我尝试了以下查询,但看起来它进入循环(查询在内部执行)。
SPARQL查询不应该有办法进入循环。首先执行子查询,然后执行封闭查询。没有办法重新执行内部或类似的东西。 (当然,查询可能很昂贵并需要很长时间,但这不是一个循环,原则上仍然是有限的。)
另外,使用 owl:作为标准OWL命名空间之外的其他内容的前缀有些令人困惑,并且可能在他们看到您的查询时误导其他开发人员。它本身没有任何不正确之处,但您可能需要考虑为命名空间使用不同的前缀。
您的查询中有一部分可能会使事情变得相当昂贵。你有模式
?entity rdf:type ?type .
?type rdfs:subClassOf* ?retailcat .
其中?entity 未与其他任何内容相关联,并且未在其他地方使用。这意味着您将为?entity 的每个可能值提供子查询解决方案,这只是意味着您将结果数乘以?entity <的可能值的数量/强>
如果我了解您的查询,您尝试从用户感兴趣的类别,从类别树到某些根概念,然后在该根下查找其他类别。你实际上并不需要子查询;您可以使用非嵌套查询来执行此操作:
select ?user ?othercat {
?user rdf:type owl:User .
?user owl:hasUserProfile ?userprofile .
?userprofile rdf:type owl:UserProfile .
?userprofile owl:interestedIn ?retailcat .
?retailcat rdfs:subClassOf ?root .
?othercat rdfs:subClassOf ?root .
}
这将找到?retailcat 的兄弟?retailcat 的值,以及?retailcat 本身。如果您想避免?retailcat ,可以添加
filter(?othercat != ?retailcat)
但这不应该对性能产生太大影响;这只是一个过滤掉的结果。
您可能想要考虑的唯一其他因素是您并未真正使用rdfs:subClassOf找到类别树的“根”;你只是上升了一个级别。例如,如果您的类别树看起来像
并且用户对 Mustang 感兴趣,然后您将前往 SportsCar 并找到 Corvette ,但您不会在树上走得更远。 (如果你有可用的推论,你可能实际上在树上走得更远,但我现在假设你不这样做。)要按照子类链接树,你可以添加 * 走向追随链的道路:
?retailcat rdfs:subClassOf* ?root .
?othercat rdfs:subClassOf ?root .
然后你会得到树中的所有课程(除了最高级别的课程,汽车)。