specialweb/gremlin-dsl

Gremlin DSL PHP integration

1.0.1 2022-10-05 14:52 UTC

README

PHPCS PHPUnit License Downloads Latest version codecov

Information

As the original repository was discontinued this is the continuing package to work with.

Introduction

Gremlin is a graph traversal language developed by Apache TinkerPop.

Many graph vendors like Neo4j, Azure Cosmos, AWS Neptune and many more supports Gremlin.

This package provides a basic integration of gremlin for php applications.

This version is built from TinkerPop v3.6.1.

Installation

composer require specialweb/gremlin-dsl

Configuration

This packages provides a static Configuration Class with some configuration options.

You can either configure it from array:

use SpecialWeb\GremlinDSL\Configuration;

/** @var \Brightzone\GremlinDriver\Connection $connection */
$connection = null;

Configuration::fromConfig([
    'sendClosure' => function (string $traversalString) use ($connection) {
         return $connection->send($traversalString);
     },
    'enableShortFunctions' => true,
]);

or set the desired settings directly:

use SpecialWeb\GremlinDSL\Configuration;

/** @var \Brightzone\GremlinDriver\Connection $connection */
$connection = null;

Configuration::getInstance()
    ->setSendClosure(function (string $traversalString) use ($connection) {
        return $connection->send($traversalString);
    })
    ->enableShortFunctions()
;

Usage

Just install the package and begin traversing.

<?php
require_once 'vendor/autoload.php';

echo \SpecialWeb\GremlinDSL\Traversal\GraphTraversal::g()
    ->V(1)->out('knows')->has('age', new \SpecialWeb\GremlinDSL\Traversal\Predicates\Gt(30))->values('name');
# g.V(1).out("knows").has("age", gt(30)).values("name")

Sending the graph traversal string

There is a pseudo send step provided with this package.

You can either globally configure a closure for the send step or provide it with every call.

<?php
require_once 'vendor/autoload.php';

use SpecialWeb\GremlinDSL\Configuration;

/** @var \Brightzone\GremlinDriver\Connection $connection */
$connection = null;
$sendClosure = function (string $traversalString) use ($connection) {
    return $connection->send($traversalString);
};

Configuration::getInstance()->setSendClosure($sendClosure);
g()->V(1)->out("knows")->has("age", gt(30))->values("name")->send();

# or

g()->V(1)->out("knows")->has("age", gt(30))->values("name")->send($sendClosure);

Instead of a closure you can also provide an instance of SendClosureInterface.

use SpecialWeb\GremlinDSL\Traversal\SendClosureInterface;
use SpecialWeb\GremlinDSL\Traversal\GraphTraversalInterface;

class SendClosure implements SendClosureInterface
{
    public function __invoke(GraphTraversalInterface $graphTraversal, string $traversalString) {
        // handle the send
    }
}

Short functions

Short functions are simplifying the graph traversal generation and usage of predicates.

You've to enable GREMLIN_DSL_REGISTER_GLOBAL_FUNCTIONS, manually load e.g. resources/predicates.php or call Configuration::enableShortFunctions() to make short functions available.

<?php

require_once 'vendor/autoload.php';

\SpecialWeb\GremlinDSL\Configuration::getInstance()->enableShortFunctions();
g()->V(1)->out('knows')->has('age', gt(30))->values('name');
# g.V(1).out("knows").has("age", gt(30)).values("name")

With GREMLIN_DSL_REGISTER_GLOBAL_FUNCTIONS constant:

<?php

define('GREMLIN_DSL_REGISTER_GLOBAL_FUNCTIONS', true);
require_once 'vendor/autoload.php';

# With GREMLIN_DSL_REGISTER_GLOBAL_FUNCTIONS enabled:
g()->V(1)->out('knows')->has('age', gt(30))->values('name');
# g.V(1).out("knows").has("age", gt(30)).values("name")

Development

DSL generation

The DSL generation is based on the java base-classes.

To (re)generate the DSL just call make generate that will first generate the JSON methods structure and afterwards the php file generation.

Generate JSON only

Just call make generate-json or mvn -f generator -P glv-json compile

Generate PHP only

To e.g. adjust the php file generation you can either call php generate.php [dsl:generate [<in-file>]] or make generate-php