public function testComputeSimilarity2() { $instance = new KNNModelBuilder(null, new CosineSimilarity()); $source = new ObjectSet(Rating::class); $destination = new ObjectSet(Rating::class); $node1 = new FakeNode(1); $node2 = new FakeNode(2); $node3 = new FakeNode(3); $node4 = new FakeNode(4); $node5 = new FakeNode(5); $source->add(new Rating(1, $node1->identity())); $source->add(new Rating(3, $node4->identity())); $destination->add(new Rating(1, $node2->identity())); $destination->add(new Rating(2, $node4->identity())); $destination->add(new Rating(5, $node5->identity())); $similarity = $instance->computeSimilarity($source, $destination); $this->assertTrue($similarity >= 0.34641016 && $similarity <= 0.346410161514); }
<?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");