2014-01-27 31 views
0

今天我已經爲PHP寫了Neo4j的第一個基本程序。這基本上是爲了檢查我們是否可以使用Neo4jPhp從我們的PHP項目中使用Neo4j。 https://github.com/jadell/neo4jphpNeo4jPhp太慢

這裏是我的代碼

<!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

可以調試和測量什麼的REST請求Neo4j的服務器實際上正在?它應該是像86毫秒,其餘的應該在PHP代碼?另外,請使用參數,以便您不必爲重複密碼查詢創建查詢計劃。

+0

你是什麼意思的參數?你可以請分享我可以閱讀的任何鏈接。謝謝 – user609306

1

我已經看到了Neo4j的谷歌集團的問題還有,我問,如果你能在PHP中測量的執行時間,如果不是使用

回聲$行[「N」] - >的getProperty ('名稱') 。 「\ 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個節點我在WebAdmin的有兩個和在85毫秒左右的PHP。數據量不足以獲得準確的結果,因此我將節點數增加到了500.時間執行上升到了115ms,包括webadmin和php腳本。將我的節點增加到2000我的執行時間爲200毫秒,但webadmin和php之間沒有顯着差異。最後我得到了我的節點高達10000.好了,現在我們有一些結果。 Webadmin在1020ms內返回10000個節點。雖然Php太慢了。

執行時間總計:1635.6329917908毫秒

我覺得這不是我所期望的。而不是使用$行[「X」]方法我print_r的結果和時間增加到

執行時間總計: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']; 
} 

上述代碼的結果將是這樣的。

1111111111111111111111 ...... 執行時間總計:1084.1178894043毫秒

正如你可以看到PHP和網站管理的同時返回10000項(10000個節點我不認爲60 ms是一個主要的區別),並用這個結論我的重要答案:在php和Neo4j中我們沒有時間去檢索大量的數據,但是我們放鬆了很多時間在PHP上在瀏覽器上呈現這些數據。