/**
  * @param \GraphAware\Common\Type\NodeInterface $input
  * @param \GraphAware\Reco4PHP\Engine\DiscoveryEngine[] $engines
  *
  * @return \GraphAware\Common\Result\ResultCollection
  */
 public function processDiscovery(NodeInterface $input, array $engines)
 {
     $stack = $this->databaseService->getDriver()->stack();
     foreach ($engines as $engine) {
         $statement = $engine->discoveryQuery($input);
         $stack->push($statement->text(), $statement->parameters(), $engine->name());
     }
     try {
         $resultCollection = $this->databaseService->getDriver()->runStack($stack);
         return $resultCollection;
     } catch (\Exception $e) {
         throw new \RuntimeException($e->getMessage());
     }
 }
 /**
  * @param \GraphAware\Common\Type\NodeInterface $input
  * @param array                                 $engines
  *
  * @return \GraphAware\Common\Result\ResultCollection
  */
 public function processDiscovery(NodeInterface $input, array $engines)
 {
     $stack = $this->databaseService->getDriver()->stack();
     foreach ($engines as $engine) {
         /* @var \GraphAware\Reco4PHP\Engine\DiscoveryEngine $engine */
         $engine->buildParams($input);
         $query = $this->inputQueryPart($input) . $engine->query();
         $stack->push($query, $engine->parameters(), $engine->name());
     }
     try {
         $resultCollection = $this->databaseService->getDriver()->runStack($stack);
         return $resultCollection;
     } catch (\Exception $e) {
         throw new \RuntimeException($e->getMessage());
     }
 }
 /**
  * @param \GraphAware\Common\Type\NodeInterface $input
  * @param \GraphAware\Reco4PHP\Result\Recommendations $recommendations
  * @param \GraphAware\Reco4PHP\Engine\RecommendationEngine $recommendationEngine
  *
  * @return \GraphAware\Common\Result\ResultCollection
  */
 public function execute(NodeInterface $input, Recommendations $recommendations, RecommendationEngine $recommendationEngine)
 {
     $stack = $this->databaseService->getDriver()->stack('post_process_' . $recommendationEngine->name());
     foreach ($recommendationEngine->postProcessors() as $postProcessor) {
         if ($postProcessor instanceof CypherAwarePostProcessor) {
             foreach ($recommendations->getItems() as $recommendation) {
                 $tag = sprintf('post_process_%s_%d', $postProcessor->name(), $recommendation->item()->identity());
                 $statement = $postProcessor->buildQuery($input, $recommendation);
                 $stack->push($statement->text(), $statement->parameters(), $tag);
             }
         }
     }
     try {
         $results = $this->databaseService->getDriver()->runStack($stack);
         return $results;
     } catch (\Exception $e) {
         throw new \RuntimeException('PostProcess Query Exception - ' . $e->getMessage());
     }
 }
 /**
  * @param string $label
  * @param string $key
  * @param mixed  $value
  *
  * @return \GraphAware\Common\Type\Node
  */
 public function findInputBy($label, $key, $value)
 {
     $query = sprintf('MATCH (n:%s {%s: {value} }) RETURN n as input', $label, $key);
     $result = $this->databaseService->getDriver()->run($query, ['value' => $value]);
     return $this->validateInput($result);
 }
<?php

require_once __DIR__ . '/../vendor/autoload.php';
use GraphAware\Reco4PHP\Persistence\DatabaseService;
use GraphAware\Reco4PHP\Algorithms\Model\KNNModelBuilder;
use GraphAware\Reco4PHP\Algorithms\Model\Rating;
use GraphAware\Reco4PHP\Common\ObjectSet;
use GraphAware\Reco4PHP\Algorithms\Similarity\CosineSimilarity;
use Symfony\Component\Stopwatch\Stopwatch;
$db = new DatabaseService("http://*****:*****@localhost:7474");
$driver = $db->getDriver();
$knn = new KNNModelBuilder(null, new CosineSimilarity());
$s = microtime(true);
$qA = "MATCH (m:Movie) OPTIONAL MATCH (m)<-[r:RATED]-(u)\nRETURN id(m) as m, collect({rating: r.rating, user: id(u)}) as ratings LIMIT 1500";
$stopwatch = new Stopwatch();
$stopwatch->start("e");
$result = $driver->run($qA);
$e = $stopwatch->stop("e");
echo $e->getDuration() . PHP_EOL;
$stopwatch->start("simil");
$pairs = [];
$crs = array_chunk($result->records(), 100);
foreach ($result->records() as $record) {
    $source = new ObjectSet(Rating::class);
    $m = $record->value("m");
    foreach ($record->value("ratings") as $rating) {
        $source->add(new Rating($rating['rating'], $rating['user']));
    }
    foreach ($crs as $cr) {
        foreach ($cr as $record2) {
            $m2 = $record2->value("m");