簡體   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