Neo4jPhp太慢了

时间:2014-01-27 15:07:57

标签: php neo4j database-performance graph-databases neo4jphp

今天我已经为PHP编写了第一个Neo4j基础程序。这基本上是为了检查我们是否可以通过使用Neo4jPhp在PHP的新项目中使用Neo4j。 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的预期行为或我的代码或配置确实有问题。

非常感谢

2 个答案:

答案 0 :(得分:1)

我也在Neo4j Google群组中看到了您的问题,我问您是否可以在PHP中测量执行时间,而不是使用

  

echo $ row [&#39; n&#39;] - &gt; getProperty(&#39; name&#39;)。 &#34; \ n&#34 ;;

你使用

  

的print_r($结果);

让我解释一下为什么。 当我开始使用Neo4j和PHP时,我对PHP在速度方面的有效性有一些担忧。我重新创建了你的问题。首先,我创建了200个随机节点。每个节点都有一个Label,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上都得到了大约85ms。数据量不足以获得准确的结果,因此我将节点增加到500. webadmin和php脚本的时间执行时间上升到115ms。将我的节点增加到2000我的执行时间为200毫秒,但webadmin和php之间没有显着差异。最后,我的节点达到10000.好了,现在我们有了一些结果。 Webadmin在1020ms内返回10000个节点。 Php虽然太慢了。

  

总执行时间:1635.6329917908 ms

我认为这不是我所期望的。我没有使用$ row [&#39; x&#39;]方法,而是将print_r结果和时间增加到

  

总执行时间:2452.4049758911 ms

所以我认为不要打印屏幕上的所有属性,只是返回节点和计数(n),看看我们打印的每个属性的数量将是&#34; 1&#34 ;

$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 ms

正如你所看到的,php和webadmin在同一时间返回10000个结果(对于10000个节点,我认为60毫秒不是主要区别)并且总结我的答案:在php和Neo4j中我们不要浪费时间来检索大量数据,但是我们花了很多时间在PHP浏览器上呈现这些数据。

答案 1 :(得分:0)

您可以调试和测量对neo4j服务器的REST请求实际采取的内容吗?它应该像86ms,休息应该在PHP代码中?另外,请使用参数,这样您就不会有为重复密码查询创建查询计划的开销。