今天,我用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的预期行为,还是我的代码或配置真的有问题。
非常感谢
发布于 2014-01-29 03:48:59
我也在PHP中看到了您的问题,我问您是否可以在Neo4j中测量执行时间,如果不使用
回显$row'n'->getProperty('name')。"\n";。
您可以使用
print_r($result);
让我在下面解释一下原因。当我开始尝试使用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和php上都得到了大约85ms。数据量不足以获得准确的结果,因此我将节点增加到500个。webadmin和php脚本的执行时间都达到了115ms。将我的节点数增加到2000,我的执行时间为200ms,但webadmin和php之间没有显着差异。最后我把我的节点增加到了10000。好了,现在我们有了一些结果。Webadmin在1020ms内返回给我10000个节点。但是Php的速度太慢了。
总执行时间: 1635.6329917908毫秒
我认为这不是我所期望的。我没有使用$ print_r‘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'];
}上述代码的结果如下所示。
111111111111111111111111111111......总执行时间: 1084.1178894043毫秒
正如你所看到的,php和webadmin在同一时间内返回10000个结果(对于10000个节点,我不认为60ms是一个主要的区别),并以此来结束我的重要回答:在php和Neo4j中,我们没有浪费时间来检索大量数据,但是我们浪费了很多时间来在浏览器上从PHP.中呈现这些数据。
发布于 2014-01-28 20:08:24
您能调试并测量发送到neo4j服务器的REST请求的实际内容吗?应该是86ms,rest应该在PHP代码中?此外,请使用参数,这样您就不会有为重复的循环查询创建查询计划的开销。
https://stackoverflow.com/questions/21384275
复制相似问题