代码之家  ›  专栏  ›  技术社区  ›  elbillaf

用python编写SPARQL查询返回的JSON数据的正确方法

  •  1
  • elbillaf  · 技术社区  · 6 年前

    我正在使用python3进行SPARQL查询。我需要读一个virtuoso数据库并输出三元组。三元组中的一些数据包含特殊字符,如换行符等。

    不管怎样,我可以像这样取出数据:

    queryString = "some query"
    sparql.setQuery(queryString)
    sparql.setReturnFormat(JSON)
    try:
        jsonData = sparql.query()
        for result in jsonData:
            print('Result: ***')
            f.write(str(result) + '\n')
    except:
        print("Oops:", sys.exc_info()[0], file=sys.stderr)
    

    执行此操作时,文件中会显示以下输出:

    b'{\n'
    b'  "head" : {\n'
    b'    "vars" : [\n'
    b'      "subject",\n'
    b'      "predicate",\n'
    b'      "object"\n'
    b'    ]\n'
    b'  },\n'
    b'  "results" : {\n'
    b'    "bindings" : [\n'
    b'      {\n'
    b'        "predicate" : {\n'
    b'          "type" : "uri",\n'
    b'          "value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"\n'
    b'        },\n'
    b'        "subject" : {\n'
    b'          "type" : "uri",\n'
    b'          "value" : "http://www.ontologyrepository.com/CommonCoreOntologies/delimits"\n'
    b'        },\n'
    b'        "object" : {\n'
    b'          "type" : "uri",\n'
    b'          "value" : "http://www.w3.org/2002/07/owl#InverseFunctionalProperty"\n'
    b'        }\n'
    b'      },\n'
    

    等等。我不确定 b 前缀在这些行上。不管怎样,我在JSON库中读不到这个。所以我会的 更喜欢 用JSON编写。

    我想用一个简单的东西来代替for循环

    json.dump(jsonData, f)
    

    json.dumps(jsonData, f)
    

    当我这样做时,我会收到错误消息 Oops: <class 'TypeError'> . 我注意到 jsonData <class 'SPARQLWrapper.Wrapper.QueryResult'> .

    SPARQL查询是否未返回JSON?我还需要做些其他的改变吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bierbarbar    6 年前

    字符串前面的b表示字符串不是字符串,而是字节字符串,字节被解释为用于打印的字符。 Look here for more information

    下次你再多告诉我们你的问题会更容易些。您使用的库、版本、示例查询等。

    在您的案例中,我假设您使用的是SPARQLWrapper库。您非常接近解决您的问题,您只需要转换您的查询结果。打电话就行了 jsonData = sparql.query().convert() 而不是 jsonData = sparql.query() 您将得到一个dict,它可以用 json.dump .