我对以下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.
}
我的问题是关于查询的以下部分:
basekb:m.06y3r ?p1 ?cvt
:basekb:m.06y3r
的所有属性和对象分别分配到?p1
和?cvt
?
?cvt ?p2 ?o
:?cvt
的所有属性都将分配到?o
?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
。我是否可以检查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)
}
答案 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 .
}