2013-09-20 4 views
1

Использование py2neo (1.5.1) в Neo4j (1.9.2) и мне интересно, о выполнении различных команд (около 80k отношений в графике):py2neo: значения производительности и возврата различных команд

Итак, сначала я получаю все отношения (~ 80k), что, очевидно, занимает некоторое время.

graph_db = neo4j.GraphDatabaseService("http://localhost:7474/db/data/") 
rels = graph_db.match() 

Однако, почему это займет значительное количество времени (~ 1-2 минуты), чтобы перебрать отношений и распечатать их (или хранить в некоторой переменной)? rels - это список отношений, но что содержит каждое отношение?

for relation in rels: 
    print relation.start_node 
    print relation.type 
    print relation.end_node 
    print relation.get_properties() 

При удалении строки print relation.get_properties() время выполнения цикла получает гораздо лучше (~ 10 секунд). Итак, я предполагаю, что каждый relation.get_properties() выполняет запрос к db? Звучит разумно.

Однако, связанная вещь для меня: Почему следующий код намного быстрее, хотя print relation содержит всю необходимую информацию?

for relation in rels: 
    print relation  #example output: (244358)-[:KNOWS {"since":2011,"reason":"unknown"}]->(244359) 
    print relation.start_node 
    print relation.type 
    print relation.end_node 

Так печатает фактически всю информацию, мне нужно, и выполнение этого намного быстрее, несмотря на то, что, почему я не в состоянии извлечь свойства отношения и сохранить его в переменной.

for relation in rels: 
    print relation  #example output: (244358)-[:KNOWS {"since":2011,"reason":"unknown"}]->(244359) 
    print relation.start_node 
    print relation.type 
    print relation.end_node 
    #print relation["since"] #would slow down the execution significantly, why?? 

Итак, какая информация хранится в отношениях? Как я могу извлечь все свойства без использования get_properties(). Это что-то связано с кешем? Я не понимаю, это сводит меня с ума ... Я уже жду вашего ответа, Найджел ;-)

Примечание: Я знаю, что я мог бы оптимизировать его, используя партии, но это не так. действительно вопрос прямо сейчас.

EDIT:print relation["since"] также приводит к запросу для каждой итерации?

EDIT2: И хотя мы говорим о производительности, еще одно: сравнивая следующие запросы cypher, я заметил, что первый из них медленнее, чем второй, почему? (Не выполняется на холодном графике, так что никакого влияния кэша)

Query1: START п = узел (*) ВОЗВРАТ п

Query2: START п = узел (*) ВОЗВРАТ n.name, n.age

ответ

1

Объект Отношения хранит неизменяемые части этих отношений, которые возвращаются в ответе REST. Это начальный узел, конечный узел и тип. Свойства изменяются, и вызов get_properties действительно (как вы предлагаете) делает отдельный вызов на сервере.


Side Примечание: При включении ведения журнала ...

import logging 
logging.basicConfig(level=logging.DEBUG) 

... Вы должны быть в состоянии видеть движение туда и сюда.


Однако вы можете использовать небольшой трюк для получения моментального снимка свойств без отдельного вызова.Атрибут __metadata__ для любого ресурса содержит последние известные данные, получаемые с сервера, поэтому следующим должны возвращать свойство: (!) Почти выпущенного

props = my_rel.__metadata__["data"] 

С py2neo 1.6, метод match слегка эволюционировал. Вместо того, чтобы извлекать все, прежде чем возвращать его вам, он возвращает генератор и может быть повторен. Поэтому код, такой как ...

for rel in graph_db.match("KNOWS"): 
    print rel.start_node["name"] + " knows " + rel.end_node["name"] 

... будет выполняться быстрее, а не ждать получения полного ответа.

EDIT ANSWER: Да.

EDIT 2 ОТВЕТ: Это вопрос для Neo парней :-P

+0

Спасибо за ваш ответ, он мне очень помог. Несмотря на то, что я все еще интересуюсь EDIT2, так как существует такое большое различие во времени и потреблении памяти между этими двумя запросами – user2752625

Смежные вопросы