在远程端点上使用SPARQL查询RDFLib / Redland

9 投票
4 回答
5545 浏览
提问于 2025-04-16 17:00

我正在尝试查询远程端点,并获取 owl:sameAs 的映射。我试过使用 RDFLib 和 Redland,但都没有成功,可能是我对命名空间的处理不太对。

这是我在 RDFLib 中的尝试:

    import rdflib

    rdflib.plugin.register('sparql', rdflib.query.Processor, 'rdfextras.sparql.processor', 'Processor')
    rdflib.plugin.register('sparql', rdflib.query.Result, 'rdfextras.sparql.query', 'SPARQLQueryResult')

    g = rdflib.Graph()

    query = """
        SELECT *
        FROM <http://api.talis.com/stores/bbc-backstage/services/sparql>
        WHERE {
             ?s a http://purl.org/ontology/mo/MusicArtist;
                http://www.w3.org/2002/07/owl#sameAs ?o .
        }Limit 50
    """

    for row in g.query(query):
        print row

这是我在 Redland 中的尝试:

import RDF
model = RDF.Model()

query = """
    SELECT *
    FROM <http://api.talis.com/stores/bbc-backstage/services/sparql>
    WHERE {
         ?s a http://purl.org/ontology/mo/MusicArtist;
            http://www.w3.org/2002/07/owl#sameAs ?o .
    }Limit 50
"""

for statement in RDF.Query(query ,query_language="sparql").execute(model):
    print statement

你能告诉我这两个中哪个有问题吗?

我还有另一个难题:能否获取对象的数据集名称?比如说,如果有:

?s = http://www.bbc.co.uk/music/artists/eb5c8564-927d-414d-b152-c7b48a2c9d8b#artist
predicate = http://www.w3.org/2002/07/owl#sameAs
?0 = http://dbpedia.org/resource/The_Boy_Least_Likely_To

我能在这个例子中获取 "Dbpedia" 的名称吗?或者获取任何其他与我有 sameAs 连接的数据集?(或者我可能可以直接在对象字符串中查找感兴趣的数据集名称)非常非常感谢你!

4 个回答

2

你也可以考虑使用Virtuoso和RedLand,因为它支持SPARQL-FED中的“服务”参数,可以用来执行远程查询。你可以在这些在线示例中看到具体的演示。

3

Redland 目前不支持在 FROM 中使用 SPARQL 端点。你这里使用的是加载到 RDF 数据集中的 图名称。当你加载一个三元组 (s, p, o) 和上下文 c 时,这也被称为 Redland 上下文,方法类似于 model.context_add_statement(statement, context)

Rasqal GIT 支持解析 SERVICE,但目前还不能在查询中执行它。

14

各种事情:

你说得对,任何URI(统一资源标识符)都需要用<>包起来。正确的查询是:

SELECT ?s ?o WHERE {
         ?s a <http://purl.org/ontology/mo/MusicArtist>;
            <http://www.w3.org/2002/07/owl#sameAs> ?o .
    } limit 50

... 你可以在这里查看结果。

FROM在rdflib或redland中并不是你想象的那样实现。它并不会获取远程的SPARQL端点,而是获取远程图或在本地存储中具有该名称的图。在你的情况下,你需要使用SERVICE,可以查看Jena中的用法。不幸的是,rdflib和redland都没有实现SPARQL的SERVICE子句,但有一些解决方法可以解决这个问题。

一个可能的解决方案是使用SPARQLWrapper for python。这很简单,下面是你使用这个库的代码:

from SPARQLWrapper import SPARQLWrapper, JSON

sparql = SPARQLWrapper("http://api.talis.com/stores/bbc-backstage/services/sparql")
sparql.setQuery("""
    SELECT ?s ?o
    WHERE {
         ?s a <http://purl.org/ontology/mo/MusicArtist>;
            <http://www.w3.org/2002/07/owl#sameAs> ?o .
    } limit 50
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

for result in results["results"]["bindings"]:
    print result["s"]['value'], result["o"]['value']

如你所见,远程SPARQL端点变成了查询外部的一个参数。

撰写回答