我想将 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但不能得到labels或id。我也许能够得到id和labels,但它变得非常复杂和麻烦。
现在我需要的 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 端点查询数据库。不过,它仍然需要您进行大量处理。
希望这会有所帮助(或者至少解释为什么事情是这样的)。
问候,汤姆