这个 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.
}
我的问题是关于查询的以下部分:
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
。我可以检查数据库中具有 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 .
}
我对以下 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
。我可以检查数据库中具有 freebase.type_hints.mediator true
.
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 .
}