encoding - 如何防止来自 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插件
解决方案
马克原本出色的帖子现在已经过时了,所以有两个问题会阻止您的查询运行:
- 较新版本的 APOC 处理编码,因此您不想包含该
apoc.text.urlencode()
函数。 - 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上的网络浏览器
推荐阅读
- angular - AgGrid 单元组件 agInit 有时会在区域外运行
- user-interface - [FLUTTER]滚动更改标签
- unity3d - 如何使用 Hololens 自由变换物体?
- reactjs - 在 React Native 中更详细地检测缺口
- python - Django 按月和年查询
- c# - 为什么我尝试使用 c# 发送邮件时收到错误消息?
- design-patterns - 事件溯源和 CQRS,我错过了什么?
- css - 右键单击在没有 js 的纯 css 中用作悬停
- javascript - 导航后 React Native Redux useSelector 未定义
- postman - Postman Collection 运行多次 - 可以在 json 正文中发送随机唯一 ID?