今天我已经为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的预期行为或我的代码或配置确实有问题。
非常感谢
答案 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代码中?另外,请使用参数,这样您就不会有为重复密码查询创建查询计划的开销。