neo4j HTTP响应代码:400查询维基数据

pxyaymoc  于 2022-12-12  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在jupyter笔记本上运行这个程序,我正在尝试丰富查询wikidata的neo4j图。

import pandas as pd
import wikipedia
from neo4j import GraphDatabase

host = 'bolt://address:port'
user = 'user'
password = 'password'
driver = GraphDatabase.driver(host,auth=(user, password))

我有这个功能

def run_query(query, params={}):
    with driver.session() as session:
        result = session.run(query, params)
        return pd.DataFrame([r.values() for r in result], columns=result.keys())

我传递这个查询

sparqlQuery = """
  CALL apoc.periodic.iterate("MATCH (e:Entity) WHERE e.id STARTS WITH 'Q' RETURN e","
  WITH 'SELECT * WHERE{ ?item rdfs:label ?name . filter (?item = wd:' + e.id + ') filter (lang(?name) = \\\"en\\\") OPTIONAL {?item wdt:P31 [rdfs:label ?label] .filter(lang(?label)=\\\"en\\\")}}' AS sparql, e
  CALL apoc.load.jsonParams(
      'https://query.wikidata.org/sparql?query=' + sparql, 
      { Accept: 'application/sparql-results+json'}, 
      null)
  YIELD value
  UNWIND value['results']['bindings'] as row
  SET e.wikipedia_name = row.name.value
  WITH e, row.label.value AS label
  MERGE (c:Class {id:label})
  MERGE (e)-[:INSTANCE_OF]->(c)
  RETURN distinct 'done'", {batchSize:1, retry:1})
"""

可是,我找不到窃听器。
确切的错误是出现59次(由于CALL apoc.periodic.iterate):
服务器返回HTTP响应代码:URL为400:* WHERE{?item rdfs:标签?名称.过滤器(?item = wd:Q69254781)过滤器(?name)=“en”)可选{?item wdt:P31 [rdfs:标签?标签] .过滤器(?label)=“en”)}}':1,
如果您访问该URL,您将获得正确的XML结果。
我想知道这是否与

CALL apoc.load.jsonParams(
      'https://query.wikidata.org/sparql?query=' + sparql, 
      { Accept: 'application/sparql-results+json'}, 
      null)

我尝试简化Cypher查询。我没有成功。我还删除了filter和lang。什么都没有。

qxsslcnc

qxsslcnc1#

我看到这个错误,你可能需要对SPARQL查询进行URL编码。问题是,在这中间你不必编码它,但似乎有一些变化,你需要重新编码它。

CALL apoc.load.jsonParams(
      'https://query.wikidata.org/sparql?query=' + apoc.text.urlencode(sparql), 
      { Accept: 'application/sparql-results+json'}, 
      null)

相关问题