环境:neo4j-5.1.0、py2neo-2021.2.3、Neo4j Desktop-1.5.2、python3.9.13

1、创建neo4j链接,对数据库进行增删改的时候报错。

报错代码:

JSONDecodeError                           Traceback (most recent call last)
D:\anaconda3\lib\site-packages\py2neo\client\http.py in from_json(cls, status, data)
    442         try:
--> 443             content = json_loads(data, object_hook=JSONHydrant.json_to_packstream)
    444         except ValueError as error:

D:\anaconda3\lib\json\__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    358         kw['parse_constant'] = parse_constant
--> 359     return cls(**kw).decode(s)

D:\anaconda3\lib\json\decoder.py in decode(self, s, _w)
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()

D:\anaconda3\lib\json\decoder.py in raw_decode(self, s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

The above exception was the direct cause of the following exception:

ProtocolError                             Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_8660\3422543364.py in <module>
      9         relation = Relationship(start_node,'hasConcept',end_node)
     10         print(relation)
---> 11         g.merge(start_node,'article_id','article_id')
     12         g.merge(end_node,'keyword','keyword')
     13         g.merge(relation,'hasConcept','keyword')

D:\anaconda3\lib\site-packages\py2neo\database.py in merge(self, subgraph, label, *property_keys)
    676         :param property_keys: property keys on which to match any existing nodes
    677         """
--> 678         self.update(lambda tx: tx.merge(subgraph, label, *property_keys))
    679 
    680     @property

D:\anaconda3\lib\site-packages\py2neo\database.py in update(self, cypher, parameters, timeout)
    443         if callable(cypher):
    444             if parameters is None:
--> 445                 self._update(cypher, timeout=timeout)
    446             elif (isinstance(parameters, tuple) and len(parameters) == 2 and
    447                     isinstance(parameters[0], Sequence) and isinstance(parameters[1], Mapping)):

D:\anaconda3\lib\site-packages\py2neo\database.py in _update(self, f, timeout)
    465             tx = None
    466             try:
--> 467                 tx = self.begin(
    468                                 # after=after, metadata=metadata, timeout=timeout
    469                                 )

D:\anaconda3\lib\site-packages\py2neo\database.py in begin(self, readonly)
    349         removed. Use the 'auto' method instead.*
    350         """
--> 351         return Transaction(self, autocommit=False, readonly=readonly,
    352                            # after, metadata, timeout
    353                            )

D:\anaconda3\lib\site-packages\py2neo\database.py in __init__(self, graph, autocommit, readonly)
    913             self._ref = None
    914         else:
--> 915             self._ref = self._connector.begin(self.graph.name, readonly=readonly,
    916                                               # after, metadata, timeout
    917                                               )

D:\anaconda3\lib\site-packages\py2neo\client\__init__.py in begin(self, graph_name, readonly)
   1357         cx = self._acquire(graph_name)
   1358         try:
-> 1359             return cx.begin(graph_name, readonly=readonly,
   1360                             # after=after, metadata=metadata, timeout=timeout
   1361                             )

D:\anaconda3\lib\site-packages\py2neo\client\http.py in begin(self, graph_name, readonly)
    197             #     raise TypeError("Transaction timeouts are not supported over HTTP")
    198             r = self._post(HTTPTransactionRef.begin_uri(graph_name))
--> 199             rs = HTTPResponse.from_json(r.status, r.data.decode("utf-8"))
    200             location_path = urlsplit(r.headers["Location"]).path
    201             tx = HTTPTransactionRef(graph_name, location_path.rpartition("/")[-1])

D:\anaconda3\lib\site-packages\py2neo\client\http.py in from_json(cls, status, data)
    443             content = json_loads(data, object_hook=JSONHydrant.json_to_packstream)
    444         except ValueError as error:
--> 445             raise_from(ProtocolError("Cannot decode response content as JSON"), error)
    446         else:
    447             return cls(status, content)

D:\anaconda3\lib\site-packages\six.py in raise_from(value, from_value)

ProtocolError: Cannot decode response content as JSON

奇怪的是,同样的代码、数据,用在python3.8.3的环境中没有报错,所以首先查看两个版本python的区别,发现json的__init__中有一些小区别,关于json解析的,手动给3.9.13的init进行修改,仍然报错,思考是否是别的问题。

2、寻找其他解决方案

参考了一个解决方案:https://blog.csdn.net/weixin_44155966/article/details/127704336

但是实际上没有解决问题,依然报错。

3、受到方案启发,认为是graph_name为空时的问题

看了上方的解决方案之后,感觉这个报错逻辑有些奇怪,实际上不是json的问题,还是连接neo4j时,指定的graph不够明确,所以在连接时指定name如下:

 此时,再次执行控制neo4j的指令代码,就不再报错了。

更多推荐