【问题标题】:Neo4j Cypher query on Rest returns 500 response对 Rest 的 Neo4j Cypher 查询返回 500 响应
【发布时间】:2014-10-02 09:08:38
【问题描述】:

我尝试向 neo4j 2.1.3 发送一个简单的 Cypher 查询并得到 500 响应:

POST : http://localhost:7474/db/data/cypher

data = {
  "query" : "MATCH (it) return it limit 10"
   }

尝试了包含以下标头的不同变体:

   {'content-type': 'application/json',"Accept": 'application/json'}

所有结果都是相同的 500 http 响应。

顺便说一句 .. 常规 Rest API 请求,例如:http://localhost:7474/db/data/node 工作正常..

【问题讨论】:

  • 您能分享一下您用于发送该 http 请求的确切代码吗?
  • 您也可以检查 data/log/neo4j.log 文件中的错误消息吗?
  • 没有代码...我刚刚尝试了使用 'postman' 的 POST 请求。并且在日志中没有它的痕迹

标签: neo4j cypher


【解决方案1】:

不是 100%,但 AFAIK http 标头区分大小写,因此请尝试使用 Content-Type 而不是 content-type。如果您仍然获得 500,请检查 data/log 和/或 data/graph.db/messages.log 是否有任何有用的条目。

【讨论】:

  • HTTP 标头不应区分大小写 w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 。其余的听起来不错:)
  • @JohnMark13:你是对的。 skme:尝试跟踪您通过网络发送的完整请求和响应(包括标头)。
  • 我有,并尝试了所有选项是否大写。消除内容类型时,我得到一个 415 响应,所以我猜它确实接受了标题。正如我上面提到的,在日志中找不到任何东西
【解决方案2】:

显然问题在于数据的编码。 不确定到底是什么,但我在 neo4j-rest-client code 中找到了它。

有一个编码功能。使用它,一切正常。

def _json_encode( data, ensure_ascii=False):

 def _any(data):
    ret = None
    if isinstance(data, (list, tuple)):
        ret = _list(data)
    elif isinstance(data, dict):
        ret = _dict(data)
    elif isinstance(data, decimal.Decimal):
        ret = str(data)
    elif isinstance(data, datetime.time):
        ret = data.strftime(options.TIME_FORMAT)
    else:
        ret = data
    return ret

 def _list(data):
    ret = []
    for v in data:
        ret.append(_any(v))
    return ret

 def _dict(data):
    ret = {}
    for k, v in data.items():
        # Neo4j doesn't allow 'null' properties
        if v is not None:
            ret[k] = _any(v)
    return ret
 ret = _any(data)
 return json.dumps(ret, ensure_ascii=ensure_ascii)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2023-01-28
    相关资源
    最近更新 更多