Rdf SPARQL Construct子句以包含谓词文本

Rdf SPARQL Construct子句以包含谓词文本,rdf,sparql,sesame,Rdf,Sparql,Sesame,我正在尝试使用SPARQL构造从dbpedia中剥离一组数据-我只对一组艺术家感兴趣,我希望芝麻尽可能小以提高速度 我想我能做的是使用CONSTRUCT获取给定艺术家的每个谓词。我可以让第一个CONSTRUCT子句工作以确保我得到“Person”类型,但这只会让我得到满足该子句的三元组-我希望他们的姓名、标签、出生地等。我下面的查询试图在第二个CONSTRUCT子句中捕获莫奈的名字?如果我没弄错的话,这会给我三倍的 <http://dbpedia.org/resource/Claude_M

我正在尝试使用SPARQL构造从dbpedia中剥离一组数据-我只对一组艺术家感兴趣,我希望芝麻尽可能小以提高速度

我想我能做的是使用CONSTRUCT获取给定艺术家的每个谓词。我可以让第一个CONSTRUCT子句工作以确保我得到“Person”类型,但这只会让我得到满足该子句的三元组-我希望他们的姓名、标签、出生地等。我下面的查询试图在第二个CONSTRUCT子句中捕获莫奈的名字?如果我没弄错的话,这会给我三倍的

<http://dbpedia.org/resource/Claude_Monet>  
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   
<http://xmlns.com/foaf/0.1/Person>

还有一个像这样的三元组

<http://dbpedia.org/resource/Claude_Monet>  
<http://xmlns.com/foaf/0.1/name>
"Claude Monet"@en

“克劳德·莫奈”@en
如何让我的查询使用莫奈名字的对象作为变量,以便在插入空引号时使用?这是问题

PREFIX purl: <http://purl.org/dc/elements/1.1/>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
CONSTRUCT {
  ?s a foaf:Person .
  ?s foaf:name ""
} WHERE { 
  ?s foaf:surname "Monet"@en . 
  ?s purl:description "Painter"@en
} LIMIT 100
前缀purl:
前缀foaf:
构造{
这是一个人。
?s foaf:名称“”
}何处{
s foaf:姓“莫奈”@en。
?s purl:描述“画家”@en
}限制100
非常感谢您的帮助


迈克

我们到了,就是这里。有一次,我计算了构造之间的变量绑定以及它实际上是直接的

每个WHERE语句都从repo中选择这些值,并且在引用相同变量的构造中需要一个匹配的模板语句。值刚刚被替换。我想很明显

请注意,self必须停止像RDBMS那样思考

PREFIX purl: <http://purl.org/dc/elements/1.1/>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
PREFIX dbont:  <http://dbpedia.org/ontology/>
PREFIX w3: <http://www.w3.org/2000/01/rdf-schema#>

CONSTRUCT 
{
    ?s a foaf:Person .
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i
}  
WHERE {
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i .
    ?s purl:description "Painter"@en
}
前缀purl:
前缀foaf:
前缀dbont:
前缀w3:
构造
{
这是一个人。
s foaf:姓名。
s foaf:姓b。
s foaf:givename?c。
?s w3:标签?d。
s purl:描述e。
?s dbont:出生地?f。
死亡之地。
?s dbont:出生日期?h。
?s dbont:死亡日期?i
}  
在哪里{
s foaf:姓名。
s foaf:姓b。
s foaf:givename?c。
?s w3:标签?d。
s purl:描述e。
?s dbont:出生地?f。
死亡之地。
?s dbont:出生日期?h。
死亡日期。
?s purl:描述“画家”@en
}

我们到了,就是这里。有一次,我计算了构造之间的变量绑定以及它实际上是直接的

每个WHERE语句都从repo中选择这些值,并且在引用相同变量的构造中需要一个匹配的模板语句。值刚刚被替换。我想很明显

请注意,self必须停止像RDBMS那样思考

PREFIX purl: <http://purl.org/dc/elements/1.1/>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
PREFIX dbont:  <http://dbpedia.org/ontology/>
PREFIX w3: <http://www.w3.org/2000/01/rdf-schema#>

CONSTRUCT 
{
    ?s a foaf:Person .
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i
}  
WHERE {
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i .
    ?s purl:description "Painter"@en
}
前缀purl:
前缀foaf:
前缀dbont:
前缀w3:
构造
{
这是一个人。
s foaf:姓名。
s foaf:姓b。
s foaf:givename?c。
?s w3:标签?d。
s purl:描述e。
?s dbont:出生地?f。
死亡之地。
?s dbont:出生日期?h。
?s dbont:死亡日期?i
}  
在哪里{
s foaf:姓名。
s foaf:姓b。
s foaf:givename?c。
?s w3:标签?d。
s purl:描述e。
?s dbont:出生地?f。
死亡之地。
?s dbont:出生日期?h。
死亡日期。
?s purl:描述“画家”@en
}

作为替代/简写,您还可以使用描述查询,例如:

DESCRIBE <http://dbpedia.org/resource/Claude_Monet>
将为所有具有匹配的
purl:description
?x
提供一个子图

当然,这使您对提取的确切三元组的控制更少,但从正面来看,它更短,如果特定资源不存在某些三元组模式,也不需要进行调整(例如,如果由于任何原因,某个特定的油漆工没有
死亡日期
foaf:lasname
或WHERE子句中的任何其他属性,则构造查询将不匹配)


一个小警告:descripe查询结果的精确内容取决于实现。例如,一些TripleStore可能选择只返回传出属性。但是Sesame(我相信还有DBPedia端点)返回已知的。

作为替代/简写,您还可以使用描述查询,例如:

DESCRIBE <http://dbpedia.org/resource/Claude_Monet>
将为所有具有匹配的
purl:description
?x
提供一个子图

当然,这使您对提取的确切三元组的控制更少,但从正面来看,它更短,如果特定资源不存在某些三元组模式,也不需要进行调整(例如,如果由于任何原因,某个特定的油漆工没有
死亡日期
foaf:lasname
或WHERE子句中的任何其他属性,则构造查询将不匹配)

一个小警告:descripe查询结果的精确内容取决于实现。例如,一些TripleStore可能选择只返回传出属性。但是Sesame(我相信还有DBPedia端点)返回已知的。

我知道您已经返回了,但我确实想指出,当
构造
查询返回的三元组与
where
部分匹配的三元组完全相同,并且
where
部分不包含任何太奇特的内容时,您可以使用特殊的速记
构造t其中

为该案例提供了构造查询表单的简短表单 其中,模板和模式相同,模式为 只是一个基本的图形模式(没有
过滤器
s,也没有复杂的图形模式
中所需的关键字WHERE
缩写形式

使用
结构,其中
,以及使用已定义的结构(这是常规的,例如,
rdfs
而不是
w3
,以及
dc
而不是
purl
),您的查询变成:

construct where {
    ?s foaf:name ?a ;
       foaf:surname ?b ;
       foaf:givenName ?c ;
       rdfs:label ?d ;
       dc:description ?e, "Painter"@en ;
       dbpedia-owl:birthPlace ?f ;
       dbpedia-owl:deathPlace ?g ;
       dbpedia-owl:birthDate ?h ;
       dbpedia-owl:deathDate ?i .
}
我知道您已经知道了,但是我想指出的是,当
构造
查询返回的三元组与t匹配的三元组完全相同时