public function testFindingTagsByPath()
 {
     $path = Vector::create('task runners', 'gulp');
     $results = $this->coll->findByPath($path);
     $this->assertEquals(3, $results->count());
     foreach ($results as $tag) {
         $this->assertNotNull($tag->getParent());
         $this->assertTrue($tag->getName()->matches('gulp'));
         $this->assertTrue($tag->getParent()->getName()->matches('task runners'));
         $grandpa = $tag->getParent()->getParent();
         $name = $tag->getParent()->getParent()->getName();
         $this->assertTrue($grandpa->getName()->matches('development tools') || $grandpa->getName()->matches('node js'));
         if ($grandpa->getName()->matches('node js')) {
             $ggp = $grandpa->getParent();
             $this->assertTrue($ggp->getName()->matches('javascript') || $ggp->getName()->matches('asynchronous event-driven programming'));
         } else {
             $this->assertEquals($grandpa, $this->coll->findFirst('development tools'));
         }
     }
 }
<?php

use Tag\Tag;
use Tag\Factory;
include 'vendor/autoload.php';
$logger = new Logger('test.log');
exec('rm -f test.sqlite');
$database = new Database(':memory:', $logger);
// $database = new Database('test.sqlite', $logger);
$factory = new Factory($database, $logger);
$collection = $factory->getCollection();
$data = json_decode(file_get_contents('groph.json'), true);
$fixtures = $data['tags'];
$collection->load($fixtures);
$t = $collection->findFirst('programming languages');
echo $t->ref, PHP_EOL;
$tag1 = $collection->findFirst('software development');
$path = Vector::create('programming languages', 'interpreted programming languages', 'javascript');
$steps = 0;
$names = Vector::create();
$tag1->visitPath($path, function (Tag $tag) use(&$steps, &$names) {
    echo "{$tag} [" . $tag->getId() . ']', PHP_EOL;
    $steps++;
    $names->append($tag->getName());
});
echo $path->count() . ' = ' . $steps, PHP_EOL;
function export($file)
{
    global $tagCollection, $resCollection;
    $tags = array();
    foreach ($tagCollection->findLike(array('')) as $tag) {
        $parentPath = $tag->getParent() ? $tag->getParent()->getUniquePath()->implode(':') : '';
        $tags[] = array((string) $tag->getName() => $parentPath);
    }
    $resources = array();
    foreach ($resCollection->findLike(array('')) as $res) {
        $resources[$res->getLink()] = array($res->getTitle(), $res->getTags()->toStringsArray());
    }
    file_put_contents($file, Vector::create(array('tags' => $tags, 'resources' => $resources))->toJson());
}