public function removeIrrelevant(NodeInterface $input, RecommendationEngine $engine, Recommendations $recommendations) { foreach ($recommendations->getItems() as $recommendation) { foreach ($engine->filters() as $filter) { if (!$filter->doInclude($input, $recommendation->item())) { $recommendations->remove($recommendation); } } } }
public function testTotalScoreIsIncremented() { $node = FakeNode::createDummy(); $list = new Recommendations(new SimpleContext()); $list->add($node, 'e1', new SingleScore(1)); $reco = $list->getItems()[0]; $this->assertEquals(1, $reco->totalScore()); $reco->addScore('score2', new SingleScore(1)); $this->assertEquals(2, $reco->totalScore()); }
public function buildQuery(NodeInterface $input, Recommendations $recommendations) { $ids = []; foreach ($recommendations->getItems() as $recommendation) { $ids[] = $recommendation->item()->identity(); } $query = 'UNWIND {ids} as id MATCH (n) WHERE id(n) = id RETURN id, size((n)<-[:FOLLOWS]-()) as followersCount'; return Statement::create($query, ['ids' => $ids]); }
public function testResultGetTwoScoresIfDiscoveredTwice() { $node = FakeNode::createDummy(); $list = new Recommendations(); $list->add($node, 'e1', new SingleScore(1)); $list->add($node, 'e2', new SingleScore(1)); $this->assertEquals(1, $list->size()); $this->assertEquals(2, $list->getItems()[0]->totalScore()); $this->assertCount(2, $list->get(0)->getScores()); $this->assertArrayHasKey('e1', $list->get(0)->getScores()); $this->assertArrayHasKey('e2', $list->get(0)->getScores()); }
public function buildQuery(Node $input, Recommendations $recommendations) { $query = 'UNWIND {ids} as id MATCH (n) WHERE id(n) = id MATCH (n)<-[r:RATED]-(u) RETURN id(n) as id, sum(r.rating) as score'; $ids = []; foreach ($recommendations->getItems() as $item) { $ids[] = $item->item()->identity(); } return Statement::create($query, ['ids' => $ids]); }
public final function handleResultSet(Node $input, Result $result, Recommendations $recommendations) { $recordsMap = []; foreach ($result->records() as $i => $record) { if (!$record->hasValue($this->idResultName())) { throw new \InvalidArgumentException(sprintf('The record does not contain a value with key "%s" in "%s"', $this->idResultName(), $this->name())); } $recordsMap[$record->get($this->idResultName())] = $record; } foreach ($recommendations->getItems() as $recommendation) { if (array_key_exists($recommendation->item()->identity(), $recordsMap)) { $this->postProcess($input, $recommendation, $recordsMap[$recommendation->item()->identity()]); } } }
private function removeIrrelevant(Node $input, RecommendationEngine $engine, Recommendations $recommendations, array $blacklist) { foreach ($recommendations->getItems() as $recommendation) { if (array_key_exists($recommendation->item()->identity(), $blacklist)) { $recommendations->remove($recommendation); } else { foreach ($engine->filters() as $filter) { if (!$filter->doInclude($input, $recommendation->item())) { $recommendations->remove($recommendation); break; } } } } }
public function execute(NodeInterface $input, Recommendations $recommendations, RecommendationEngine $recommendationEngine) { $this->stack = $this->databaseService->getDriver()->stack('post_process_' . $recommendationEngine->name()); foreach ($recommendationEngine->postProcessors() as $postProcessor) { if ($postProcessor instanceof CypherAwarePostProcessor) { foreach ($recommendations->getItems() as $recommendation) { $this->prepareQuery($input, $recommendation, $postProcessor); } } } try { $results = $this->databaseService->getDriver()->runStack($this->stack); $this->stack = null; return $results; } catch (\Exception $e) { throw new \RuntimeException('PostProcess Query Exception - ' . $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 \GraphAware\Reco4PHP\Result\Recommendations $recommendations */ public function merge(Recommendations $recommendations) { foreach ($recommendations->getItems() as $recommendation) { $this->getOrCreate($recommendation->item())->addScores($recommendation->getScores()); } }