2014-01-27 1 views
0

오늘 저는 PHP에서 Neo4j에 대한 기본 프로그램을 작성했습니다. 이것은 기본적으로 Neo4jPhp를 사용하여 PHP의 새 프로젝트에서 Neo4j를 사용할 수 있는지 확인하기 위해 수행되었습니다. https://github.com/jadell/neo4jphpNeo4jPhp too slow

여기 난 그냥 자신의 재산으로 모든 노드를 검색하고 지금 여기 내 코드

<!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 무엇을 측정 할 수 있습니까? 그것은 86ms와 같은 것이어야하며 나머지는 PHP 코드에 있어야합니다? 또한 반복적 인 사이퍼 쿼리에 대한 쿼리 계획을 만들지 않아도되므로 매개 변수를 사용하십시오.

+0

매개 변수는 무엇을 의미합니까? 당신은 내가 그것에 대해 읽을 수있는 링크를 공유 할 수 있습니까? 감사 – user609306

1
나는뿐만 아니라 Neo4j Google 그룹에 질문을 본 당신은 PHP의 실행 시간을 측정하는 경우 대신 [앤]를

에코 $ 행을 사용하여 수 있는지 물었다

-> getProperty에 ('이름'). "\엔";.

당신은

인 print_r ($ 결과)를 사용;

이유를 설명해 드리겠습니다. Neo4j와 PHP로 게임을 시작했을 때 PHP의 속도면에서 약간의 우려가있었습니다. 이렇게 문제를 재현했습니다. 먼저 200 개의 랜덤 노드를 만들었습니다. 각 노드에는 레이블, 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 ($result as $row) { 
    echo $row['n']->getProperty('name') . "\n"; 
} 

을했고,이 코드 (200 개) 내가으로 WebAdmin 모두에있어 노드와 함께

$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'; 

를 사용하여 실행 시간을 측정처럼 나는 결과를 얻은 foreach 루프를 사용하여 PHP는 약 85ms. 데이터의 양이 정확한 결과를 얻기에 충분하지 않기 때문에 노드를 500으로 늘 렸습니다. 시간 실행은 webadmin과 PHP 스크립트 모두 115ms까지 올라갔습니다. 내 노드를 2000으로 늘리는 데는 200ms의 실행 시간이 있었지만 webadmin과 PHP 사이에는 큰 차이가 없었다. 마지막으로 노드 수를 10000 개로 늘 렸습니다. 이제 결과가 나타납니다. Webadmin은 1020ms에 10000 개의 노드를 반환합니다. PHP는 너무 느립니다.

총 실행 시간 : 1635.6329917908 MS

나는 이것이 내가 기대하지 생각합니다. 대신 $ 행을 사용하는 [ '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 ...... 총 실행 시간 : 당신이 (10000 개 노드 I (60) 생각하지 않습니다 PHP를 볼 수 있으며, 같은 시간에 10000 개 결과를 반환으로 WebAdmin으로 1084.1178894043 MS

ms는 큰 차이가 있습니다.) 그리고 내 큰 대답을 결론 지으면서 : php와 Neo4j에서 많은 양의 데이터를 검색 할 시간이 없지만 PHP에서이 데이터를 브라우저에 렌더링하는 데 많은 시간이 필요합니다.