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,

Если вам нужно точное количество созданных или обновленных свойств, то вы должны использовать "Совпадение" с "Создать" или "Совпадение" с "Задать", а затем подсчитать размер результатов. Слияние может не возвращать, какие из них были обновлены, а какие созданы.

Другие вопросы по тегам