获取给定根的所有子节点的多个SELECT查询

时间:2016-05-31 10:30:13

标签: sparql

我想定义与用户兴趣相对应的根类别。然后我需要返回给定根目录下的所有其他潜在兴趣。 我尝试了以下查询,但看起来它进入循环(查询在内部执行)。

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 .
      }
    }
}

当我执行子查询时,它工作正常,但它返回用户的当前兴趣,而不提供同一根的其他子概念的信息。

如何解决这个问题?

1 个答案:

答案 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找到类别树的“根”;你只是上升了一个级别。例如,如果您的类别树看起来像

  • 汽车
    • SUV
    • 跑车
      • 克尔维特
      • 野马

并且用户对 Mustang 感兴趣,然后您将前往 SportsCar 并找到 Corvette ,但您不会在树上走得更远。 (如果你有可用的推论,你可能实际上在树上走得更远,但我现在假设你不这样做。)要按照子类链接树,你可以添加 * 走向追随链的道路:

?retailcat rdfs:subClassOf* ?root .
?othercat rdfs:subClassOf ?root .

然后你会得到树中的所有课程(除了最高级别的课程,汽车)。