首页 > 解决方案 > 如何防止来自 Neo4j 的 Wikidata 查询中不必要的编码?

问题描述

我正在尝试在这里完成教程:https ://www.markhneedham.com/blog/2020/02/04/neo4j-enriching-existing-graph-wikidata-sparql-api/

但是,当我到达产生表 3 结果的 Cypher 查询时:

MATCH (player:Player)
WHERE player.name = "Nick Kyrgios"
WITH "SELECT *
WHERE { ?person wdt:P106 wd:Q10833314 ;
                rdfs:label \"" + player.name + "\"@en ;
                wdt:P569 ?dateOfBirth ;
                wdt:P27 [ rdfs:label ?countryName ] .
       filter(lang(?countryName) = \"en\")
}" AS sparql
CALL apoc.load.jsonParams(
  "https://query.wikidata.org/sparql?query=" + apoc.text.urlencode(sparql),
  { Accept: "application/sparql-results+json"},
  null
)
YIELD value
RETURN value

我收到以下错误:

调用过程失败apoc.load.jsonParams:原因:java.lang.RuntimeException:无法读取 url 或密钥https://query.wikidata.org/sparql?query=SELECT+*%250AWHERE+%257B+%253Fperson+wdt%253AP106+wd% 253AQ10833314+%253B%250A++++++++++++++++++rdfs%253Alabel+%2522Nick+Kyrgios%2522%2540en+%253B%250A++++++++++++++ ++wdt%253AP569+%253FdateOfBirth+%253B%250A++++++++++++++++wdt%253AP27+%255B+rdfs%253Alabel+%253FcountryName+%255D+.%250A+++++++ filter%2528lang%2528%253FcountryName%2529+%253D+%2522en%2522%2529%250A%257D作为 json:服务器返回 HTTP 响应代码:400 用于 URL:https://query.wikidata.org/sparql?query=SELECT+*%250AWHERE+%257B+%253Fperson+wdt%253AP106+wd%253AQ10833314+%253B%250A++++++++++++++++ rdfs%253Alabel+%2522Nick+Kyrgios%2522%2540en+%253B%250A++++++++++++++++wdt%253AP569+%253FdateOfBirth+%253B%250A++++++++++++ ++++++wdt%253AP27+%255B+rdfs%253Alabel+%253FcountryName+%255D+.%250A+++++++filter%2528lang%2528%253FcountryName%2529+%253D+%2522en%2522%2529%250A% 257D

当我在 Wikidata 的沙箱上自行运行 Sparql 查询时,我没有收到任何错误。我认为这个问题与编码有关(错误消息中的 URL 有额外的“25”,大概是因为它对所有 % 符号进行了双重编码)。当我从错误消息中复制/粘贴 URL 并手动删除所有 25 个时,它连接到 Wikidata 并返回一个 JSON 文件就好了。

我已经尝试过 Cypher 的 REPLACE() 函数来消除额外的 25,但它并没有摆脱它们,我最终得到了相同的错误消息。

有没有人遇到过这个问题并找到解决方法?

Ubuntu 20.04,Neo4j Desktop 1.4.5,我安装了APOC插件

标签: encodingneo4jsparql

解决方案


马克原本出色的帖子现在已经过时了,所以有两个问题会阻止您的查询运行:

  1. 较新版本的 APOC 处理编码,因此您不想包含该apoc.text.urlencode()函数。
  2. SPARQL 字符串中的换行符会导致问题,我们需要消除它们。

试试这个代码:

WITH 'SELECT * WHERE { ?person wdt:P106 wd:Q10833314 ; rdfs:label "Nick Kyrgios"@en ; wdt:P569 ?dateOfBirth ; wdt:P27 [ rdfs:label ?countryName ] . filter(lang(?countryName) = "en")}' AS sparql
CALL apoc.load.jsonParams("https://query.wikidata.org/sparql?query=" + sparql,
  { Accept: "application/sparql-results+json"},
  null
)
YIELD value
RETURN value

请注意,我曾经'将 URL 字符串括起来,但您可以根据需要使用"。只需记住使用\"转义字符串中的任何双引号,正如 Mark 在他的帖子中所示。例如,rdfs:label \"Nick Kyrgios\"@en……

我的环境:
通过 neo4j Enterprise 4.3.5
APOC 版本 4.3.0.3上的网络浏览器


推荐阅读