9

我希望将 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 .         
        }   
    }       
}
4

2 回答 2

7

GRAPH 不会隐式地将远程数据提取到存储中,这会带来太大的安全风险。可能有一些系统可以启用此功能,但它是非标准的。

但是,在 SPARQL 1.1 更新中,有一个关键字 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 语句中,然后运行您的原始查询。

注意,在某些系统中,例如 4store,您需要启用 LOAD,默认情况下是不允许的,因此请查看您正在使用的商店的文档。

于 2011-02-11T14:15:01.057 回答
4

而不是使用 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 .         
        }  
    }       
}

这样您就可以绕过安全问题,并且不必在自己的三元存储中维护数据。

于 2011-02-16T19:11:08.153 回答