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

What do these parts of this SPARQL query mean?

我对以下 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 ?cvtbasekb:m.06y3r的所有属性和对象分别赋值给?p1?cvt?

  2. ?cvt ?p2 ?o?cvt的所有属性将赋值给?o

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


次要更新

假设我想知道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。我可以检查数据库中具有 freebase.type_hints.mediator true.

的对象的 **set 中是否包含* business.employment_tenure

伪代码

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

此查询不会产生任何结果。完全正确,但 working.I 不需要 ID 值 ?value 来检查它是否是 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 和 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 .
}

这会选择那些每个历史及其所有值,这样历史就有 一些 值,它的类型是中介。

您可以使用一些 属性 路径使其更短一些。 (<>|!<>)是通配符属性,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 .
}