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);
 }
Esempio n. 2
0
<?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");