首页 文章

使用 SPARQL 中的“GRAPH”关键字来获取远程图形

提问于
浏览
8

我希望使用 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 .         
        }   
    }       
}

2 回答

  • 5

    GRAPH 不会隐式地将远程数据提取到商店中,这会带来太大的安全风险。可能有一些系统可以启用它,但它是 non-standard。

    但是,在 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。在某些系统中,e.g. 4store 你需要启用 LOAD,默认情况下不允许这样做,所以请查看你正在使用的商店的文档。

  • 5

    一旦你发现了你需要包含的图形,而不是使用 LOAD,根据上面的史蒂夫的例子,选择使用 FROM NAMED 是不合理的,在结果查询中陈述所有相关的图形 i.e

    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 .         
            }  
        }       
    }
    

    这样您就可以解决安全问题,而无需在自己的三元组中维护数据。

相关问题