我正在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。什么都没有。
1条答案
按热度按时间qxsslcnc1#
我看到这个错误,你可能需要对SPARQL查询进行URL编码。问题是,在这中间你不必编码它,但似乎有一些变化,你需要重新编码它。