使用 python 从 neo4j 获取 json 响应

Tus*_*wal 5 python json neo4j

我想将 neo4j 中的 cypher 查询结果转换为 JSON 格式。

我目前正在使用 neo4j 库来连接和查询图表。我可以,但是将结果转换为 JSON 很麻烦,因此这个问题。

这是我当前的代码:

from neo4j.v1 import GraphDatabase, basic_auth
from config import bolt_url,auth_id,auth_pass

driver = GraphDatabase.driver(bolt_url, auth=basic_auth(auth_id, auth_pass))
session = driver.session()

def get_some_data(limit=25) :
    query = 'MATCH (n:Person)--(m:Organization) \
            RETURN n,m LIMIT ' + str(limit)
    return session.run(query)

result_some_data = get_some_data(limit=1)
gen = result_some_data.records()

for record in gen :
    for k,v in record.items() :
        print('{',k,':',v,'}')
        print(v.get('name','meow'))

session.close
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

{ n : <Node id=44567 labels={'Person'} properties={'name': 'ABC'}> }
ABC
{ m : <Node id=34745 labels={'Organization'} properties={'name': 'XYZ'}> }
XYZ
Run Code Online (Sandbox Code Playgroud)

如您所见,输出给出了Node对象。我能够得到 , properties但不能得到labelsid。我也许能够得到idlabels,但它变得非常复杂和麻烦。

现在我需要的 JSON 格式非常具体,我不希望得到该特定格式的结果。

假设这是我需要的基本 JSON 格式:

{
    "results": [{
        "columns": ["n", "m"],
        "data": [{
            "graph": {
                "nodes": [{
                    "id": "44567",
                    "labels": ["Person"],
                    "properties": {
                        "name": "ABC"
                    }
                }, {
                    "id": "34745",
                    "labels": ["Organization"],
                    "properties": {
                        "name": "ABC"
                }],
                "relationships": [{
                    "id": "1",
                    "type": "WorksIn",
                    "startNode": "44567",
                    "endNode": "34745",
                    "properties": {
                        "title": "CEO"
                    }
                }]
            }
        }]
    }],
}
Run Code Online (Sandbox Code Playgroud)

这里的代码不是我将来要使用的代码,它只是我为问这个问题而编写的演示代码。

所以基本上我在这里问的是一种在运行密码查询后从 Neo4j 获取 JSON 响应的方法,而不是解析结果然后生成 JSON。

小智 5

import json 
def get_some_data(limit=25) :
    query = 'MATCH (n:Person)--(m:Organization) RETURN n,m LIMIT ' + str(limit)
    return session.run(query)

json_data = json.dumps(get_some_data(limit=1).data())
Run Code Online (Sandbox Code Playgroud)

data() 递归地提供json格式的记录


小智 0

不确定你所说的获取标签和 id 很麻烦是什么意思...我的意思是,如果你有一个 Node 对象 o 那么 id 是o.id,标签是o.labels,不是吗?

不管怎样,问题是 Cypher 可以返回很多不同的东西(离散值表、节点、关系、路径、子图……),当通过驱动程序访问数据库时,你必须确定什么与结果有关。因此,您会得到一个结果集(从数据库的角度来看,它可以包含任何内容),并且必须自己进行后处理(因为只有您知道您实际要求的内容)。

如果您确实想要类似 JSON 的结果,可以通过 HTTP 端点查询数据库。不过,它仍然需要您进行大量处理。

希望这会有所帮助(或者至少解释为什么事情是这样的)。

问候,汤姆