我希望将SPARQL用于一个相对基本的任务:给定一个FOAF图,我想解析我在那里找到的元素,获取它们的标签(如果它们存在),然后将它们用作新图形从中可以找到有关这些人的信息。
例如,您可以想象一个简单的用例,我想运行一个SPARQL查询来列出我喜欢的所有食物(根据我的FOAF文件),以及我所有朋友最喜欢的食物。
这就是目前的情况。请注意,出于测试目的,目前我正在尝试使用下面的查询,通过?name3变量获取朋友的名字。运行此查询不会返回?graph和?name3的任何结果,即使我知道rdfs:seeAlso链接到一些有效的RDF文件,其中至少有两个应该具有name属性。感谢您提供任何意见!
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?graph ?name3
FROM <my-rdf-file>
WHERE {
?person1 foaf:knows ?person2 .
?person1 foaf:name ?name1 .
?person2 foaf:name ?name2 .
OPTIONAL {
?person2 rdfs:seeAlso ?graph .
GRAPH ?graph {
?person3 foaf:name ?name3 .
}
}
}
答案 0 :(得分:5)
GRAPH不会隐式地将远程数据提取到商店中,这会带来太大的安全风险。可能有一些系统你可以启用它,但它是非标准的。
但是,在SPARQL 1.1 Update中,有一个关键字LOAD,虽然可以这样做,但你可以这样写:
LOAD <uri>
这会将图表提取到商店,因此您可以写:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?graph
FROM <my-rdf-file>
WHERE {
?person1 foaf:knows ?person2 .
?person1 foaf:name ?name1 .
?person2 foaf:name ?name2 .
OPTIONAL {
?person2 rdfs:seeAlso ?graph .
}
}
将?graph的绑定提供给一组LOAD语句,然后运行原始查询。
N.B。在一些系统中,例如4store你需要启用LOAD,默认情况下不允许这样做,所以请查看你正在使用的商店的文档。
答案 1 :(得分:5)
一旦你发现了你需要包含的图形,而不是使用LOAD,根据上面的史蒂夫的例子,选择使用FROM NAMED是不合理的,在结果查询中说明所有相关的图形,即
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?name3
FROM <my-rdf-file>
FROM NAMED <discovered-graph-URI-1>
FROM NAMED <discovered-graph-URI-n>
WHERE {
GRAPH <my-rdf-file> {
?person1 foaf:knows ?person2 .
?person1 foaf:name ?name1 .
?person2 foaf:name ?name2 .
}
OPTIONAL {
?person2 rdfs:seeAlso <discovered-graph-URI-1> .
GRAPH <discovered-graph-URI-1> {
?person3 foaf:name ?name3 .
}
?person2 rdfs:seeAlso <discovered-graph-URI-n> .
GRAPH <discovered-graph-URI-n> {
?person3 foaf:name ?name3 .
}
}
}
这样您就可以解决安全问题,而无需在自己的三元库中维护数据。