这个SPARQL查询的这些部分是什么意思?

时间:2015-06-25 14:08:38

标签: sparql

我对以下SPARQL查询有三个问题:

PREFIX basekb:<http://rdf.basekb.com/ns/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>

select ?p2 ?o where {
   basekb:m.06y3r ?p1 ?cvt .
   ?cvt ?p2 ?o .
   ?cvt basekb:freebase.type_hints.mediator true.
}

我的问题是关于查询的以下部分:

  1. basekb:m.06y3r ?p1 ?cvt basekb:m.06y3r的所有属性和对象分别分配到?p1?cvt

  2. ?cvt ?p2 ?o ?cvt的所有属性都将分配到?o

  3. ?cvt basekb: freebase.type_hints.mediator true: 检查谓词是否等于1

  4. 次要更新

    假设我想知道basekb:m.06y3r的就业历史。假设我知道数据库中具有 freebase.type_hints.mediator true 的对象集。

    select ?cvt ?p2 ?o
    where {
       basekb:m.06y3r basekb:people.person.employment_history ?cvt.
       ?cvt ?p2 ?o
    }
    

    此查询将输出以下三元组子集:

        :m.04j3rn8  :type   :business.employment_tenure
        :m.04j3rn0  :type   :business.employment_tenure
        :m.04j3rng  :type   :business.employment_tenure
    

    m.04j3rn8的类型为business.employment_tenure,实际上是mediator,因此它有freebase.type_hints.mediator true。我是否可以检查business.employment_tenure数据库中对象的**集中是否包含freebase.type_hints.mediator true

    伪代码

    select ?cvt ?p2 ?o
        where {
           basekb:m.06y3r basekb:people.person.employment_history ?cvt.
           ?cvt ?p2 ?o
           IF ?o  belongs to the set of objects that are considered as mediators then output results.
        }
    

    根据此link business.employment_tenure具有以下属性:

    http://rdf.basekb.com/public/knownAs 就业期限

    它具有以下类型http://www.w3.org/2000/01/rdf-schema#Class。 Sheesh freebase很奇怪

    解决方案

    我能够写出这个查询,但不知道它为什么这么慢。它给出了正确的结果。我能够提取复合值类型。

    PREFIX basekb:<http://rdf.basekb.com/ns/>
    PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
    
    
    select distinct ?history ?p3 ?o3 where {
       basekb:m.06y3r basekb:people.person.employment_history ?history .
       ?history ?property ?value;
       ?p3 ?o3.
       ?value rdfs:label ?label. 
       ?s ?p2 ?label;
       basekb:freebase.type_hints.mediator true .
    }
    

    此查询不会产生任何结果。它完全正确但是没有工作。我需要ID值?以检查它是否是CVT。

    PREFIX basekb:<http://rdf.basekb.com/ns/>
    PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
    PREFIX key:<http://rdf.basekb.com/key/>
    
    
    select distinct ?history ?p3 ?o3 where {
       basekb:m.06y3r basekb:people.person.employment_history ?history .
       ?history ?property ?value;
       ?p3 ?o3.
       ?value basekb:freebase.type_hints.mediator true .
       FILTER(basekb:m.06y3r != ?o3)
    }
    

1 个答案:

答案 0 :(得分:1)

你有1和2正确,但3有点偏。模式

?cvt basekb:freebase.type_hints.mediator true.
如果?cvt的值具有属性 basekb:freebase.type_hints.mediator 的值,则

匹配,值为 true 。 RDF具有数据类型的文字值,并且布尔值与数字不同。在RDF中,数字1与布尔值true不同,并且在查询中没有像某些编程语言中可能存在的那样自动转换。模式?x ?y 1将匹配对象为1的三元组,模式?x ?y true将匹配对象为真的三元组。

根据您问题的更新,听起来您需要一个类似的查询:

select ?history ?property ?value  where {
   basekb:m.06y3r basekb:people.person.employment_history ?history .
   ?history ?property ?value .
   ?history ?p ?o .
   ?o :type ?type .
   ?type freebase.type_hints.mediator true .
}

这将选择每个历史记录及其所有值,以便历史记录具有某些值,该值具有作为介体的类型。

您可以使用某些属性路径缩短一点。 (&lt;&gt; |!&lt;&gt;)是一个通配符属性, a / b / c 表示序列路径, ^ p 表示反方向 p 。你最终可以得到这个:

select ?history ?property ?value where {
   ?history ^basekb:people.person.employment_history basekb:m.06y3r ;
            ?property ?value ;
            (<>|!<>)/:type/freebase.type_hints.mediator true .
}