Neo4jPhp太慢(Neo4jPhp too slow)

2019-10-28 12:42发布

今天,我写了第一个基本程序Neo4j的从PHP。 这基本上做检查,如果我们可以通过使用Neo4jPhp在我们的新项目中使用的Neo4j从PHP。 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或什么预期的行为是真的错了我的代码或配置。

非常感谢

Answer 1:

我已经看到了Neo4j的谷歌集团的问题还有,我问,如果你能在PHP中测量的执行时间,如果不是使用

回声$行[ 'N'] - >的getProperty( '姓名')。 “\ n” 个;.

你用

的print_r($结果);

让我在下面解释为什么。 当我开始玩弄的Neo4j和PHP我有超过PHP的有效性一些顾虑在速度方面。 我重新像这样您的问题。 首先,我创建了200个随机节点。 每个节点都有一个标签,10点的属性和每个属性具有10个字符的数值。 这是TE剧本我使用。

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的和周围的85ms PHP了。 数据量是不够的,得到准确的结果,所以我增加了我的节点500执行一次上升到115ms的WebAdmin的和PHP脚本两者。 增加我的节点到2000年我有200ms的执行时间,但WebAdmin的和PHP之间没有显著差异。 最后,我得到了我的节点高达10000好了,现在我们有一些结果。 网站管理返回到我1020ms 10000个节点。 PHP是太慢虽然。

执行时间总计:1635.6329917908毫秒

我觉得这不是我所期望的。 而不是使用$行[“X”]方法我print_r的结果和时间增加至

执行时间总计: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和网站管理的同时返回10000项(10000个节点我不认为60毫秒是一个主要的区别),并得出结论:我的大答案有这样在PHP和Neo4j的我们没有松动的时间来检索大量的数据,但我们失去了很多的时间来渲染我们从PHP浏览器这个数据。



Answer 2:

你可以调试和测量REST请求Neo4j的服务器实际上正在采取什么? 它应该像86ms,剩下的应该是在PHP代码? 另外,请使用参数,使您不必创建重复暗号查询的查询计划的开销。



文章来源: Neo4jPhp too slow