/** * @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");