py2neo возвращает количество созданных узлов и отношений
Мне нужно создать функцию Python так, чтобы она добавляла узлы и отношения к графику и возвращала количество созданных узлов и отношений.
Я добавил узлы и отношения, используя graph.cypher.execute().
arr_len = len(dic_st[story_id]['PER'])
for j in dic_st[story_id]['PER']:
graph.cypher.execute("MERGE (n:PER {name:{name}})",name = j[0].upper()) #creating the nodes of PER in the story
print j[0]
for j in range(0,arr_len):
for k in range(j+1,arr_len):
graph.cypher.execute("MATCH (p1:PER {name:{name1}}), (p2:PER {name:{name2}}) WHERE upper(p1.name)<>upper(p2.name) CREATE UNIQUE (p1)-[r:in_same_doc {st_id:{st_id}}]-(p2)", name1=dic_st[story_id]['PER'][j][0].upper(),name2=dic_st[story_id]['PER'][k][0].upper(),st_id=story_id) #linking the edges for PER nodes
Что мне нужно, это вернуть количество новых узлов и созданных отношений.
Из документации neo4j я узнал, что в шифре есть что-то под названием "ON CREATE" и "ON MATCH" для MERGE, но это не очень полезно. Интерфейс браузера для neo4j действительно показывает количество обновленных узлов и отношений. Это то, что мне нужно вернуть, но у меня не получается получить к нему доступ.
Любая помощь, пожалуйста.
3 ответа
Когда ты post
ваш запрос к конечной точке Cypher REST API neo4j без использования py2neo, вы можете включить аргумент "includeStats": true
в вашем почтовом запросе, чтобы получить статистику узлов / отношений. Смотрите этот вопрос для примера.
Насколько я могу судить, py2neo в настоящее время не поддерживает дополнительные параметры для запроса Cypher (даже если он использует те же конечные точки API под капотом).
В Python вы можете сделать что-то вроде этого (используя запросы и пакеты json):
import requests
import json
payload = {
"statements": [{
"statement": "CREATE (t:Test) RETURN t",
"includeStats": True
}]
}
r = requests.post('http://your_server_host:7474/db/data/transaction/commit',
data=json.dumps(payload))
print(r.text)
В ответ будет включена статистика о количестве созданных узлов и т. Д.
{
"stats":{
"contains_updates":true,
"nodes_created":1,
"nodes_deleted":0,
"properties_set":1,
"relationships_created":0,
"relationship_deleted":0,
"labels_added":1,
"labels_removed":0,
"indexes_added":0,
"indexes_removed":0,
"constraints_added":0,
"constraints_removed":0
}
}
После выполнения вашего запроса с помощью x = session.run(...)
ты можешь использовать x.summary.counters
чтобы получить статистику, отмеченную в ответе Мартина Перуссе. Смотрите документацию здесь.
В старых версиях счетчики доступны в виде "частного" поля в x._summary.counters
,
Если вам нужно точное количество созданных или обновленных свойств, то вы должны использовать "Совпадение" с "Создать" или "Совпадение" с "Задать", а затем подсчитать размер результатов. Слияние может не возвращать, какие из них были обновлены, а какие созданы.