Neo4jPhp слишком медленный

Сегодня я написал первую базовую программу для Neo4j на PHP. В основном это было сделано, чтобы проверить, можем ли мы использовать Neo4j в нашем новом проекте из PHP с помощью Neo4jPhp. https://github.com/jadell/neo4jphp

вот мой код

<!DOCTYPE html>
<html>
<body>

<h1>My first PHP page</h1>

<?php

include 'neo4jphp.phar';
echo "Hello World!";

// Connecting to the default port 7474 on localhost
$client = new Everyman\Neo4j\Client();
$queryString = 
    "MATCH (n)".
    "RETURN n";
$query = new Everyman\Neo4j\Cypher\Query($client, $queryString);
$result = $query->getResultSet();


foreach ($result as $row) {
    echo $row['n']->getProperty('name') . "\n";
}

?>

</body>
</html>

Теперь я просто извлекаю все узлы с их свойством. Довольно просто.

если я запускаю это из графической консоли Neo4j, это занимает 86 мс. У меня всего 200 узлов и почти такое же свойство.

match (n)
return n


Returned 50 rows in 86 ms

Если я запускаю этот PHP-файл сверху, для вывода данных в браузере требуется всего 2-4 секунды. Neo4j работает на той же машине.

Обратите внимание, что я не делал никаких изменений в конфигурации PHP и Neo4j. Все по умолчанию. Скажите, пожалуйста, это ожидаемое поведение Neo4j с PHP или что-то действительно не так с моим кодом или конфигурацией.

Большое спасибо


person user609306    schedule 27.01.2014    source источник


Ответы (2)


Я также видел ваш вопрос в группе Neo4j Google и спросил, можете ли вы измерить в PHP время выполнения, если вместо использования

эхо $row['n']->getProperty('имя') . "\п";.

ты используешь

print_r ($ результат);

Позвольте мне объяснить ниже, почему. Когда я начал экспериментировать с Neo4j и PHP, у меня были некоторые опасения по поводу эффективности PHP с точки зрения скорости. Я воссоздал вашу проблему так. Сначала я создал 200 случайных узлов. Каждый узел имеет метку, 10 свойств, и каждое свойство имеет значение 10 символов. Это сценарий, который я использовал.

for ($x=1; $x<=200; $x++)
  {
  $queryString = "CREATE (n:User { name : '".substr(md5(rand()), 0, 10)."' , city : '".substr(md5(rand()), 0, 10)."' , date : '".substr(md5(rand()), 0, 10)."', age : '".substr(md5(rand()), 0, 10)."', country : '".substr(md5(rand()), 0, 10)."', language : '".substr(md5(rand()), 0, 10)."', origin : '".substr(md5(rand()), 0, 10)."', preference : '".substr(md5(rand()), 0, 10)."', color : '".substr(md5(rand()), 0, 10)."', graduate : '".substr(md5(rand()), 0, 10)."'})";
            $query = new Everyman\Neo4j\Cypher\Query($client, $queryString);
            $result = $query->getResultSet();
  } 

Используя цикл foreach, я получил такой же результат, как и вы.

foreach ($result as $row) {
    echo $row['n']->getProperty('name') . "\n";
}

и я измерил время выполнения с помощью этого кода

$time_start = microtime(true);

$queryString = "MATCH (n) RETURN n";
            $query = new Everyman\Neo4j\Cypher\Query($client, $queryString);
            $result = $query->getResultSet();

foreach ($result as $row) {
    echo $row['n']->getProperty('name') . "\n";
}

$time_end = microtime(true);


$execution_time = ($time_end - $time_start)*1000;

//execution time of the script
echo '<b>Total Execution Time:</b> '.$execution_time.' ms';

С 200 узлами я получил как на webadmin, так и на php около 85 мс. Объема данных недостаточно для получения точных результатов, поэтому я увеличил свои узлы до 500. Время выполнения увеличилось до 115 мс как для веб-админа, так и для php-скрипта. При увеличении количества узлов до 2000 у меня было время выполнения 200 мс, но существенных различий между webadmin и php не было. Наконец, я увеличил свои узлы до 10000. Хорошо, теперь у нас есть некоторые результаты. Webadmin возвращает мне 10000 узлов за 1020 мс. Но Php слишком медленный.

Общее время выполнения: 1635,6329917908 мс

Я думаю, это не то, чего я ожидаю. Вместо использования метода $row['x'] я печатаю результаты и время, увеличенное до

Общее время выполнения: 2452,4049758911 мс

Итак, я думаю, давайте не будем печатать все свойства на экране, а просто вернем узлы и количество (n) и посмотрим, что у нас есть, если мы напечатаем количество каждого из них, которое будет «1».

$queryString = "MATCH (n) RETURN n AS n, count(n) AS x";
            $query = new Everyman\Neo4j\Cypher\Query($client, $queryString);
            $result = $query->getResultSet();
foreach ($result as $row) {
    echo $row['x'];
}

Результат приведенного выше кода будет примерно таким.

1111111111111111111111...... Общее время выполнения: 1084,1178894043 мс

Как вы можете видеть, php и webadmin возвращают 10000 результатов за одно и то же время (для 10000 узлов я не думаю, что 60 мс являются большой разницей), и завершаю свой большой ответ следующим:в php и Neo4j мы не теряем время для извлечения большого объема данных, но мы теряем много времени, чтобы отобразить эти данные в нашем браузере из PHP.

person SotirisTsartsaris    schedule 28.01.2014

Можете ли вы отладить и измерить, что на самом деле принимает запрос REST к серверу neo4j? Должно быть что-то вроде 86 мс, остальное должно быть в коде PHP? Кроме того, используйте параметры, чтобы не создавать планы запросов для повторяющихся шифровальных запросов.

person Peter Neubauer    schedule 28.01.2014
comment
Что вы имеете в виду под параметрами? Не могли бы вы поделиться ссылкой, где я могу прочитать об этом. Спасибо - person user609306; 28.01.2014