使用 APOC 批处理加载器在 Neo4j 中获取不清楚的错误消息

Getting an unclear Error Message in Neo4j with APOC batch loader

我正在从 json 文件中将大量 Neo4j 节点加载到系统中。它失败并显示此错误消息“无法调用过程 apoc.merge.node:由:java.lang.NullPointerException 引起”- 我没有看到足够的信息来弄清楚我做错了什么,因为这是我第一次已经用过这个,我只是看不到它。这是错误堆栈中的最后 7 个左右的错误。看起来错误起源于调用 merge_node 时。

  File "F:\ClientSide\current\testload1.py", line 104, in <lambda>
    nodes.apply(lambda h: merge_node(h), axis=1)
  File "F:\ClientSide\current\testload1.py", line 61, in merge_node
    ses.run("UNWIND $batch AS row CALL apoc.merge.node(['ProgNode', row.nodetype], {node:row.node}, apoc.map.removeKeys(properties(row), ['nodetype', 'node'])) YIELD node RETURN 1", batch=BATCH["batch"])
  File "C:\Users\Bill Dickenson\AppData\Local\Programs\Python\Python37\lib\site-packages\neo4j\work\simple.py", line 217, in run
    self._autoResult._run(query, parameters, self._config.database, self._config.default_access_mode, self._bookmarks, **kwparameters)
  File "C:\Users\Bill Dickenson\AppData\Local\Programs\Python\Python37\lib\site-packages\neo4j\work\result.py", line 101, in _run
    self._attach()
  File "C:\Users\Bill Dickenson\AppData\Local\Programs\Python\Python37\lib\site-packages\neo4j\work\result.py", line 202, in _attach
    self._connection.fetch_message()
  File "C:\Users\Bill Dickenson\AppData\Local\Programs\Python\Python37\lib\site-packages\neo4j\io\_bolt3.py", line 326, in fetch_message
    response.on_failure(summary_metadata or {})
  File "C:\Users\Bill Dickenson\AppData\Local\Programs\Python\Python37\lib\site-packages\neo4j\io\_bolt3.py", line 512, in on_failure
    raise Neo4jError.hydrate(**metadata)
neo4j.exceptions.ClientError: Failed to invoke procedure `apoc.merge.node`: Caused by: java.lang.NullPointerException

“批处理”数据结构包含像这样的变量列表

{'EIEO': True, 'FILECOUNT': 1, 'KDM': 'data:Writes', 'changed': False, 'ctx': '113540257', 'level': 'code', 'location': [55, 8, 55, 94], 'node': 100, 'quvioDensity': 1.0, 'quviolations': 2, 'szAFP': '', 'szaep': 17, 'szlocs': 2, 'text': 'FilemavenWrapperPropertyFile=newFile(baseDirectory,MAVEN_WRAPPER_PROPERTIES_PATH);', 'type': 'localVariableDeclarationStatement'}

处理它的代码如下所示,包括生成上述数据的打印语句。

def merge_node(args):
    global INNODE, NODECOUNT
    """
    Function to create nodes from a batch.
    """
    INNODE += 1
    if (INNODE % 10000) == 0:
        print("...Sent %s of %s for processing" % (INNODE, NODECOUNT))
    if len(BATCH['batch']) == 4:
        print(BATCH['batch'][3])
    if (len(BATCH['batch']) > 1000) or (INNODE == NODECOUNT):
        if INNODE == NODECOUNT:
            print("...Final Record (%s) added and transmitted" % INNODE)
            BATCH['batch'].append(args.to_dict())            
        with graphDB_Driver.session() as ses:
            ses.run("UNWIND $batch AS row CALL apoc.merge.node(['ProgNode', row.nodetype], {node:row.node}, apoc.map.removeKeys(properties(row), ['nodetype', 'node'])) YIELD node RETURN 1", batch=BATCH["batch"])
        reset_batch()
    BATCH['batch'].append(args.to_dict())

奇怪的是,这在本地运行时出现了这个错误。当它针对我的远程 Neo4j 数据库运行时,它处理得很好(没有错误)但不会在服务器上生成任何内容。所以我假设它在那里失败了,但 APOC 正在重定向控制台并继续前进。

有人看到我做错了什么吗?

您问题中的 "batch" data structure 不包含您的 Cypher 代码所需的任何属性:

nodetype
node

如果您想使用该 Cypher 代码,您必须确保 $batch 列表中的所有元素至少具有这 2 个属性。