首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4jPhp太慢

Neo4jPhp太慢
EN

Stack Overflow用户
提问于 2014-01-27 23:07:57
回答 2查看 525关注 0票数 0

今天,我用PHP写了第一个Neo4j的基本程序。这基本上是为了检查我们是否可以通过使用Neo4jPhp在PHP中的新项目中使用Neo4j。https://github.com/jadell/neo4jphp

以下是我的代码

代码语言:javascript
复制
<!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个节点和几乎相同的属性。

代码语言:javascript
复制
match (n)
return n


Returned 50 rows in 86 ms

如果我从上面的PHP文件运行这个,总共需要2-4秒才能将数据转储到浏览器中。Neo4j在同一台机器上运行。

请注意,我没有对PHP和Neo4j的配置做任何更改。一切都是默认的。请告诉我这是Neo4j的预期行为,还是我的代码或配置真的有问题。

非常感谢

EN

回答 2

Stack Overflow用户

发布于 2014-01-29 03:48:59

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

回显$row'n'->getProperty('name')。"\n";。

您可以使用

print_r($result);

让我在下面解释一下原因。当我开始尝试使用Neo4j和PHP时,我对PHP在速度方面的有效性有一些担忧。我像这样重现了你的问题。首先,我创建了200个随机节点。每个节点都有一个标签,包含10个属性,每个属性的值为10个字符。这是我使用的te脚本。

代码语言:javascript
复制
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循环,我得到了和您一样的结果

代码语言:javascript
复制
foreach ($result as $row) {
    echo $row['n']->getProperty('name') . "\n";
}

我用下面的代码测量了执行的时间

代码语言:javascript
复制
$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,我的执行时间为200ms,但webadmin和php之间没有显着差异。最后我把我的节点增加到了10000。好了,现在我们有了一些结果。Webadmin在1020ms内返回给我10000个节点。但是Php的速度太慢了。

总执行时间: 1635.6329917908毫秒

我认为这不是我所期望的。我没有使用$ print_r‘x’方法,而是将结果和时间增加到

总执行时间: 2452.4049758911毫秒

所以我认为不要在屏幕上打印所有的属性,只返回节点和计数(N),看看如果我们打印每个节点的计数是"1“,我们会得到什么。

代码语言:javascript
复制
$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'];
}

上述代码的结果如下所示。

111111111111111111111111111111......总执行时间: 1084.1178894043毫秒

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

票数 1
EN

Stack Overflow用户

发布于 2014-01-28 20:08:24

您能调试并测量发送到neo4j服务器的REST请求的实际内容吗?应该是86ms,rest应该在PHP代码中?此外,请使用参数,这样您就不会有为重复的循环查询创建查询计划的开销。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21384275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档