【问题标题】:Type mismatch when importing JSON into Neo4J with Py2Neo使用 Py2Neo 将 JSON 导入 Neo4J 时类型不匹配
【发布时间】:2018-08-02 14:35:35
【问题描述】:

我有一个 JSON 文件,其头部如下所示:

"exports": {
        "type": "WordsAndPhrases",
        "date": "2018-08-02T10:07:58.047669Z",
        "relevantYears": "2012,2013,2014,2015,2016,2017",
        "Words": {
            "H1": "WORDS AND PHRASES:",
            "Word": [
                {
                    "Phrase": {
                        "id": "phrase_2011001932",
                        "title": "A common"
                    },
                    "Document": "Law of Property Act 1925, s 193(1) (as amended)",
                    "Refs": {
                        "CaseTitle": {
                            "id": "2011201246",
                            "title": "ADM Milling Ltd v Tewkesbury Town Council"
                        },
                        "title": "None",
                        "citations": "Lewison J [2011] EWHC 595 (Ch); [2012] Ch 99; [2011] 3 WLR 674, Ch D"
                    }
                },

我正在使用以下脚本将 JSON 数据导入 Neo4J:

import json
from py2neo import Graph, authenticate

authenticate("localhost:7474", "neo4j", "foobar")
graph = Graph()

with open('wp.json') as data_file:
    json = json.load(data_file)

query = """
WITH {json} AS document

UNWIND document.exports.Words.Word AS Word

MERGE (Phrase:a {phrase: Word.Phrase.title})
MERGE (Document:b {document: Word.Document})
FOREACH (case in Word.Refs.CaseTitle.title | MERGE (Report:z {report: case}))
"""

# Send Cypher query.
print (graph.run(query, json = json).dump())

前两个MERGE 查询工作正常。然而,FOREACH 查询被证明是有问题的。我正在使用FOREACH 查询来处理单个块中有多个CaseTitle 属性的实例,例如:

{
                    "Phrase": {
                        "id": "phrase_2011002042",
                        "title": "Acts contrary to purposes and principles of United Nations"
                    },
                    "Document": "Council Directive 2004/83/EC, art 12(2)(c)",
                    "Refs": [
                        {
                            "CaseTitle": {
                                "id": "2011201814",
                                "title": "Federal Republic of Germany v B"
                            },
                            "title": "None",
                            "citations": "(Joined Cases C-57/09 and C-101/09); [2012] 1 WLR 1076, ECJ"
                        },
                        {
                            "CaseTitle": {
                                "id": "2016008987",
                                "title": "Commissaire général aux réfugiés et aux apatrides v Lounani"
                            },
                            "title": "None",
                            "citations": "EU:C:2017:71; [2017] 4 WLR 52, ECJ"
                        }
                    ]
                },

当我运行脚本时,出现以下错误:

py2neo.database.status.CypherTypeError: Type mismatch: expected a map but was List{Map{title -> String("None"), CaseTitle -> Map{title -> String("Federal Republic of Germany v B"), id -> String("2011201814")}, citations -> String("(Joined Cases C-57/09 and C-101/09); [2012] 1 WLR 1076, ECJ")}, Map{title -> String("None"), CaseTitle -> Map{title -> String("Commissaire général aux réfugiés et aux apatrides v Lounani"), id -> String("2016008987")}, citations -> String("EU:C:2017:71; [2017] 4 WLR 52, ECJ")}}

JSON 似乎是有效的。谁能推荐一种处理此错误的方法?

【问题讨论】:

    标签: python-3.x neo4j cypher py2neo


    【解决方案1】:

    您应该使用Word.Refs[0].CaseTitle.title 而不是Word.Refs.CaseTitle.title。在您的 JSON 中,很明显 refs 是一个数组,您将它视为一个对象。错误消息是这样说的——当它试图取消引用“Refs”下的“CaseTitle”时,它需要一个地图,但你给它的是一个地图列表。

    【讨论】:

    • 感谢@FrobberOfBits。我已将FOREACH 查询修改为:FOREACH (case in Word.Refs[0].CaseTitle.title | MERGE (Report:z {report: case})) 我现在看到了一个不同的错误,即:py2neo.database.status.CypherTypeError: Expected Long(0) to be a org.neo4j.values.storable.TextValue, but it was a org.neo4j.values.storable.LongValue 我正在摸不着头脑,因为我希望目标属性中的值能够被识别作为字符串?
    • 该错误消息的其余部分是什么?这似乎是一个类似的问题——您需要更新原始问题以提供更新的错误和数据样本。但是错误很明显—— cypher 认为您的数据包含一个很长的数字,您试图将其视为字符串,但它不是字符串。为了解决这个问题,你必须弄清楚它在真实数据中看到的是哪个数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多