【问题标题】:SPARQL query on the remote remote endpoint RDFLib / Redland远程远程端点 RDFLib / Redland 上的 SPARQL 查询
【发布时间】:2011-05-04 18:17:17
【问题描述】:

我正在尝试查询远程端点并获取 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

这里是雷德兰:

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链接的任何其他数据集? (或者我可以在对象字符串中查找感兴趣的数据集名称)非常非常感谢您提前

【问题讨论】:

    标签: python rdf sparql rdflib redland


    【解决方案1】:

    各种东西:

    你是对的,你需要在&lt; &gt; 中包含任何URI。正确的查询是:

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

    ...查看结果here

    FROM 没有像您想象的那样在 rdflib 或 redland 中实现。它不获取远程 SPARQL 端点,而是获取远程图形或本地存储中具有该名称的图形。在您的情况下,您想使用SERVICE,请参阅how it works here with 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 端点成为查询之外的参数。

    【讨论】:

      【解决方案2】:

      Redland 目前不支持在 FROM 中使用 SPARQL 端点。您在此处使用的是您加载到 RDF 数据集中的 图形名称。当您使用 model.context_add_statement(statement, context) 之类的东西加载三元组 (s, p, o) + c 时,也称为 redland 上下文。

      Rasqal GIT 确实支持解析 SERVICE,但尚未在查询中执行它。

      【讨论】:

        【解决方案3】:

        您还可以考虑使用 Virtuoso with RedLand,因为它实现了用于远程查询执行的 SPARQL-FED“服务”参数,如这些 online examples 中所示

        【讨论】:

          【解决方案4】:

          http://terse-words.blogspot.com/2012/01/get-real-data-from-semantic-web.html 的博客条目中还有另一个简单的解决方案,它可以保持代码相当干净。它也使用 SPARQLWrapper。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多