繁体   English   中英

Neo4jPhp太慢

[英]Neo4jPhp too slow

今天,我从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的预期行为,或者我的代码或配置确实有问题。

非常感谢

我也在Neo4j Google网上论坛中看到了您的问题,我问您是否可以用PHP来衡量执行时间,而不是使用

echo $ row ['n']-> getProperty('name')。 “\\ n” 个;.

你用

的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个节点,我在85毫秒左右的时间都使用了webadmin和php。 数据量不足以获取准确的结果,所以我将节点数增加到500。webadmin和php脚本的执行时间都增加到115ms。 将节点增加到2000,我的执行时间为200ms,但是webadmin和php之间没有显着差异。 最终,我的节点数达到了10000。现在我们有了一些结果。 Webadmin在1020毫秒内向我返回了10000个节点。 php太慢了。

总执行时间:1635.6329917908 ms

我认为这不是我期望的。 我没有使用$ row ['x']方法,而是使用print_r结果和时间,

总执行时间:2452.4049758911 ms

因此,我认为不要在屏幕上打印所有属性,而只是返回节点和count(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 ms

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

您是否可以调试和衡量对neo4j服务器的REST请求实际上正在处理什么? 应该是86ms之类的东西,其余的应该在PHP代码中吗? 另外,请使用参数,以免产生重复进行密码查询的查询计划的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM