Для некоторых более подробных рецензий вы можете обратиться к этим блогам:
Или посмотрите любое из этих видео.
composer require laudis/neo4j-php-clientНайдите здесь больше подробностей
use Laudis Neo4j Authentication Authenticate ;
use Laudis Neo4j ClientBuilder ;
$ client = ClientBuilder:: create ()
-> withDriver ( ' bolt ' , ' bolt+s://user:password@localhost ' ) // creates a bolt driver
-> withDriver ( ' https ' , ' https://test.com ' , Authenticate:: basic ( ' user ' , ' password ' )) // creates an http driver
-> withDriver ( ' neo4j ' , ' neo4j://neo4j.test.com?database=my-database ' , Authenticate:: oidc ( ' token ' )) // creates an auto routed driver with an OpenID Connect token
-> withDefaultDriver ( ' bolt ' )
-> build ();Теперь вы создали клиента с драйверами Bolt, HTTPS и NEO4J . Драйвер по умолчанию, который будет использовать клиент, - это болт .
Узнайте больше о URL -адресах и о том, как их использовать для настройки драйверов здесь.
use Laudis Neo4j Contracts TransactionInterface ;
$ result = $ client -> writeTransaction ( static function ( TransactionInterface $ tsx ) {
$ result = $ tsx -> run ( ' MERGE (x {y: "z"}:X) return x ' );
return $ result -> first ()-> get ( ' x ' )[ ' y ' ];
});
echo $ result ; // echos 'z' Вы можете управлять драйвером, используя три разных подхода:
Авто, предпринятые запросы, являются наиболее простыми и наиболее интуитивными, но имеют много недостатков при запуске сложной бизнес -логики или в среде высокой доступности.
$ client -> run (
' MERGE (user {email: $email}) ' , //The query is a required parameter
[ ' email ' => ' [email protected] ' ], //Requests can be optionally added
' backup ' //The default connection can be overridden
); use Laudis Neo4j Databags Statement ;
$ statement = new Statement ( ' MERGE (user {email: $email}) ' , [ ' email ' => ' [email protected] ' ]);
$ client -> runStatement ( $ statement , ' default ' ); Метод runStatements будет выполнять все операторы одновременно. Этот метод является важным инструментом для уменьшения количества вызовов базы данных, особенно при использовании протокола HTTP.
use Laudis Neo4j Databags Statement ;
$ results = $ client -> runStatements ([
Statement:: create ( ' MATCH (x) RETURN x LIMIT 100 ' ),
Statement:: create ( ' MERGE (x:Person {email: $email}) ' , [ ' email ' => ' [email protected] ' ])
]);Функции транзакции являются стандартом де -факто при использовании драйвера. Он самый портативный, поскольку он устойчив ко многим ловушкам при первой разработке с решениями с высокой доступностью, такими как AURA NEO4J или кластер.
Драйвер управляет функциями транзакций:
Внимание: из -за автоматической функциональности повторения функция должна привести к тому же результату при последующих отзывах или в более технических терминах: должна быть идентифицирована . Всегда помните об этом при разработке логики выполнения в функции.
Некоторые примеры:
use Laudis Neo4j Contracts TransactionInterface ;
// Do a simple merge and return the result
$ result = $ client -> writeTransaction ( static function ( TransactionInterface $ tsx ) {
$ result = $ tsx -> run ( ' MERGE (x {y: "z"}:X) return x ' );
return $ result -> first ()-> get ( ' x ' )[ ' y ' ];
});
// Will result in an error
$ client -> readTransaction ( static function ( TransactionInterface $ tsx ) {
$ tsx -> run ( ' MERGE (x {y: "z"}:X) return x ' );
});
// This is a poorly designed transaction function
$ client -> writeTransaction ( static function ( TransactionInterface $ tsx ) use ( $ externalCounter ) {
$ externalCounter -> incrementNodesCreated ();
$ tsx -> run ( ' MERGE (x {y: $id}:X) return x ' , [ ' id ' => Uuid:: v4 ()]);
});
// This achieves the same effect but is safe in case it should be retried. The function is now idempotent.
$ id = Uuid:: v4 ();
$ client -> writeTransaction ( static function ( TransactionInterface $ tsx ) use ( $ id ) {
$ tsx -> run ( ' MERGE (x {y: $id}:X) return x ' , [ ' id ' => $ id ]);
});
$ externalCounter -> incrementNodesCreated ();Если вам нужен доступ нижнего уровня к возможностям драйверов, вам нужны неуправляемые транзакции. Они допускают полностью контролируемые коммиты и откаты.
Метод beginTransaction запустит транзакцию с соответствующим драйвером.
use Laudis Neo4j Databags Statement ;
$ tsx = $ client -> beginTransaction (
// This is an optional set of statements to execute while opening the transaction
[Statement:: create ( ' MERGE (x:Person({email: $email}) ' , [ ' email ' => ' [email protected] ' ])],
' backup ' // This is the optional connection alias
);Обратите внимание, что
beginTransactionвозвращает только объект транзакции, а не результаты предоставленных операторов.
Транзакция может запускать операторы, как и клиент -объект, если он все еще открыт.
$ result = $ tsx -> run ( ' MATCH (x) RETURN x LIMIT 100 ' );
$ result = $ tsx -> runStatement (Statement:: create ( ' MATCH (x) RETURN x LIMIT 100 ' ));
$ results = $ tsx -> runStatements ([Statement:: create ( ' MATCH (x) RETURN x LIMIT 100 ' )]);Откат транзакции:
$ tsx -> rollback ();Совершить транзакцию:
$ tsx -> commit ([Statement:: create ( ' MATCH (x) RETURN x LIMIT 100 ' )]);Результаты возвращаются в стандартном формате строк и столбцов:
// Results are a CypherList
$ results = $ client -> run ( ' MATCH (node:Node) RETURN node, node.id AS id ' );
// A row is a CypherMap
foreach ( $ results as $ result ) {
// Returns a Node
$ node = $ result -> get ( ' node ' );
echo $ node -> getProperty ( ' id ' );
echo $ result -> get ( ' id ' );
}Значения и типы цифр отображают эти типы и классы PHP:
| Кифре | PHP |
|---|---|
| нулевой | * null |
| нить | * string |
| целое число | * int |
| плавать | * float |
| логический | * bool |
| Карта | * LaudisNeo4jTypesCypherMap |
| Список | * LaudisNeo4jTypesCypherList |
| Точка | * LaudisNeo4jContractsPointInterface ** |
| Дата | * LaudisNeo4jTypesDate |
| Время | * LaudisNeo4jTypesTime |
| Localtime | * LaudisNeo4jTypesLocalTime |
| DateTime | * LaudisNeo4jTypesDateTime |
| DateTimezoneid | * LaudisNeo4jTypesDateTimeZoneId |
| LocalDateTime | * LaudisNeo4jTypesLocalDateTime |
| Продолжительность | * LaudisNeo4jTypesDuration |
| Узел | LaudisNeo4jTypesNode |
| Отношение | LaudisNeo4jTypesRelationship |
| Путь | LaudisNeo4jTypesPath |
(*) Эти элементы также могут использоваться в качестве параметров в протоколе болта и автоматически будут преобразованы драйвером, чтобы их можно было использовать в Cypher.
Помимо этих примеров, DateTimeInterface будет отображаться в DateTimeZoneId в Cypher. Пустой array типа списка будет преобразован в List цифр, а в map будет преобразован associative array .
(**) Точка может быть одним из четырех типов реализации PointInterface: LaudisNeo4jTypesCartesianPoint LaudisNeo4jTypesCartesian3DPoint LaudisNeo4jTypesWGS84Point LaudisNeo4jTypesWGS843DPoint
У Cypher есть списки и карты. Это понятие может быть проблематичным, поскольку стандартные массивы PHP инкапсулируют оба. Когда вы предоставляете пустой массив в качестве параметра, будет невозможно определить пустой список или карту.
Класс ParameterHelper является идеальным компаньоном для этого:
use Laudis Neo4j ParameterHelper ;
$ client -> run ( ' MATCH (x) WHERE x.slug in $listOrMap RETURN x ' , [ ' listOrMap ' => ParameterHelper:: asList ([])]); // will return an empty CypherList
$ client -> run ( ' MATCH (x) WHERE x.slug in $listOrMap RETURN x ' , [ ' listOrMap ' => ParameterHelper:: asMap ([])]); // will error
$ client -> run ( ' MATCH (x) WHERE x.slug in $listOrMap RETURN x ' , [ ' listOrMap ' => []]); // will return an empty CypherList| Версия драйвера | PHP версия | Neo4j версия |
|---|---|---|
| ^2.8 | 7.4, ^8.0 | ^3.5, ^4.0 |
| ^3.0 | ^8.0 | ^4.0, ^5.0 |
| Особенность | Поддерживается? |
|---|---|
| Аутентификация | Да |
| Транзакции | Да |
| HTTP -протокол | Да |
| Протокол болта | Да |
| Кластер | Да |
| Аура | Да |
| Протокол Jolt | Да |
| Закладки | Да |
(*) Необходимо реализовать протокол болта
(**) необходимо реализовать протокол HTTP
(***) может быть установлен для оптимальной производительности протокола болта
Если вы планируете использовать драйверы HTTP, убедитесь, что у вас есть реализации PSR-7, PSR-17 и PSR-18, включенные в проект. Если у вас их нет, вы можете установить их через композитор:
composer require nyholm/psr7 nyholm/psr7-server kriswallsmith/buzzЧтобы сделать результаты протокола болта и униформы HTTP, драйвер предоставляет форматиры результатов (он же гидраторы). Клиент настраивается с этими формами. Вы даже можете реализовать свой собственный.
Форматиром по умолчанию является LaudisNeo4jFormattersOGMFormatter , который широко объясняется в разделе формата результатов.
Драйвер предоставляет три формата по умолчанию, которые все найдены в пространстве имен форматеров:
LaudisNeo4jFormatterBasicFormatter которая стирает все типы цифр и просто возвращает каждое значение в результирующей карте как скалярное, нулевое значение или массив.LaudisNeo4jFormatterOGMFormatter , который отображает типы цифр с типами PHP, как объяснено здесь.LaudisNeo4jFormatterSummarizedResultFormatter который украшает любое формат, и добавляет обширную резюме результата.Строитель клиента предоставляет простой способ изменить форматер:
$ client = Laudis Neo4j ClientBuilder:: create ()
-> withFormatter ( Laudis Neo4j Formatter SummarizedResultFormatter:: create ())
-> build ();
/**
* The client will now return a result, decorated with a summary.
*
* @var LaudisNeo4jDatabagsSummarizedResult $results
*/
$ summarisedResult = $ client -> run ( ' MATCH (x) RETURN x ' );
// The summary contains extensive information such as counters for changed values in the database,
// information on the database, potential notifications, timing, a (profiled) plan, the type of query
// and information on the server itself.
$ summary = $ summarisedResult -> getSummary ();
// The result is exactly the same as the default.
$ result = $ summarisedResult -> getResult (); Чтобы использовать пользовательский форматер, реализуйте LaudisNeo4jContractsFormatterInterface и предоставьте его при использовании клиентского строителя.
Описанный здесь API драйвера является основной целью водителя. Из -за этого клиент - не что иное, как менеджер водителя. Водитель создает сессии. Сеанс запускает запросы через транзакцию.
Из -за этого поведения вы можете получить доступ к каждой концепции, начиная с клиента, как это:
use Laudis Neo4j ClientBuilder ;
// A builder is responsible for configuring the client on a high level.
$ builder = ClientBuilder:: create ();
// A client manages the drivers as configured by the builder.
$ client = $ builder -> build ();
// A driver manages connections and sessions.
$ driver = $ client -> getDriver ( ' default ' );
// A session manages transactions.
$ session = $ driver -> createSession ();
// A transaction is the atomic unit of the driver where are the cypher queries are chained.
$ transaction = $ session -> beginTransaction ();
// A transaction runs the actual queries
$ transaction -> run ( ' MATCH (x) RETURN count(x) ' );Если вам нужно полное управление, вы можете управлять каждому объекту с помощью пользовательских объектов конфигурации.
Клиент управляет драйверами и направляет запросы к правильным драйверам на основе предварительно сконфигурированных псевдонимов .
Объект драйвера -это защитный магистраль, который дает доступ к NEO4J. Он владеет пулом соединений и может породить сеансы для выполнения работы.
use Laudis Neo4j Basic Driver ;
use Laudis Neo4j Databags DriverConfiguration ;
$ driver = Driver:: create (
uri: ' neo4j://user:mypassword@Localhost:7687 ' ,
configuration: DriverConfiguration:: create ()-> withUserAgent ( ' MyApp/1.0.0 ' )
);Сеансы представляют собой легкие контейнеры для причинно -цепных последовательностей транзакций . Они заимствуют соединения из пула соединений по мере необходимости и цепных транзакций, используя закладки .
use Laudis Neo4j Databags SessionConfiguration ;
use Laudis Neo4j Enum AccessMode ;
$ session = $ driver -> createSession (SessionConfiguration:: create ()
-> withDatabase ( ' my-database ' )
-> withAccessMode (AccessMode:: READ ())
);Транзакции - это атомные единицы работы, которые могут содержать один или несколько запросов . Каждая транзакция связана с одним соединением и представлена в причинно -следственной цепочке закладкой .
Запросы являются исполняемыми единицами в рамках транзакций и состоят из строки Cypher и набора параметров с ключом. Каждый запрос выводит результат , который может содержать ноль или более записей .
Результат содержит выход из запроса , состоящий из метаданных заголовок, записей контента и кратких метаданных. В NEO4J 4.0 и выше приложения имеют контроль над потоком данных результатов.
Схема URL - самый простой способ настроить драйвер.
Формат конфигурации:
'<scheme>://<user>:<password>@<host>:<port>?database=<database>'
Конфигурация по умолчанию:
bolt://localhost:7687?database=neo4j
Эта библиотека поддерживает три драйвера: Bolt, HTTP и NEO4J. Часть схемы URL определяет водителя.
| водитель | схема | действительный сертификат | Самоподобный сертификат | функция |
|---|---|---|---|---|
| neo4j | neo4j | neo4j+s | NEO4J+SSC | Маршрутизация на стороне клиента над болтом |
| болт | болт | болт+с | Болт+SSC | Один сервер над болтом |
| http | http | https | Настройка с помощью реализации клиента PSR | Один сервер по HTTP |
Драйвер, сеанс и транзакция могут быть настроены с использованием объектов конфигурации. Обзор параметров конфигурации можно найти здесь:
| имя | концепция | описание | сорт |
|---|---|---|---|
| Пользовательский агент | водитель | Пользовательский агент использовал для идентификации клиента на сервере NEO4J. | DriverConfiguration |
| HTTP PSR -привязки | водитель | Соответствующая реализация PSR, используемая драйвером при использовании протокола HTTP. | DriverConfiguration |
| база данных | сессия | База данных для подключения. | SessionConfiguration |
| размер извлечения | сессия | Количество рядов для получения сразу. | SessionConfiguration |
| Режим доступа | сессия | Режим по умолчанию при доступе к серверу. | SessionConfiguration |
| закладки | сессия | Закладки использовались в сессии. (экспериментальный) | SessionConfiguration |
| метаданные | сделка | Метаданные, используемые во время транзакции. (экспериментальный) | TransactionConfiguration |
| тайм -аут | сделка | Максимальное количество времени до выхода времени. | TransactionConfiguration |
Пример кода:
use Laudis Neo4j Databags DriverConfiguration ;
use Laudis Neo4j Databags SessionConfiguration ;
use Laudis Neo4j Databags TransactionConfiguration ;
$ client = Laudis Neo4j ClientBuilder:: create ()
-> withDefaultDriverConfiguration (DriverConfiguration:: default ()-> withUserAgent ( ' MyApp/1.0.0 ' ))
-> withDefaultSessionConfiguration (SessionConfiguration:: default ()-> withDatabase ( ' app-database ' ))
-> withDefaultTransactionConfiguration (TransactionConfiguration:: default ()-> withTimeout ( 5.0 ))
-> build ();
// The client will run the query on a driver with the provided config,
// which spawns a session with the provided session config
// and runs the query in a transaction with the provided transaction config
$ client -> run ( ' MATCH (x) RETURN count(x) AS count ' );
// More granular control can be achieved by requesting the concepts yourself:
$ tsx = $ client -> getDriver ( ' default ' )
-> createSession (SessionConfiguration:: default ()-> withDatabase ( ' management-database ' ))
-> beginTransaction ( null , TransactionConfiguration:: default ()-> withTimeout ( 200 ));
$ tsx -> run ( ' SOME REALLY LONG MANAGEMENT QUERY ' );
$ tsx -> commit ();