สำหรับการเขียนรายละเอียดเพิ่มเติมคุณสามารถอ้างถึงบล็อกโพสต์เหล่านี้:
หรือดูวิดีโอเหล่านี้
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 ไดรเวอร์เริ่มต้นที่ไคลเอนต์จะใช้คือ Bolt
อ่านเพิ่มเติมเกี่ยวกับ 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] ' ])
]);ฟังก์ชั่นการทำธุรกรรมเป็นมาตรฐาน de พฤตินัย เมื่อใช้ไดรเวอร์ มันเป็นแบบพกพามากที่สุดเนื่องจากมีความทนทานต่อหลุมพรางจำนวนมากเมื่อพัฒนาครั้งแรกด้วยโซลูชันที่มีความพร้อมใช้งานสูงเช่น Neo4J Aura หรือคลัสเตอร์
ไดรเวอร์จัดการฟังก์ชั่นการทำธุรกรรม:
ความสนใจ: เนื่องจากฟังก์ชั่นการลองใหม่โดยอัตโนมัติฟังก์ชั่นควรให้ผลลัพธ์เดียวกันกับการเรียกคืนที่ตามมาหรือในแง่เทคนิคเพิ่มเติม: ควรเป็น idempotent โปรดจำไว้เสมอเมื่อออกแบบตรรกะการดำเนินการภายในฟังก์ชั่น
ตัวอย่างบางส่วน:
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 ' );
}ค่า Cypher และประเภทแผนที่ไปยังประเภทและคลาส PHP เหล่านี้:
| cypher | PHP |
|---|---|
| โมฆะ | * null |
| สาย | * string |
| จำนวนเต็ม | * int |
| ลอย | * float |
| บูลีน | * bool |
| แผนที่ | * LaudisNeo4jTypesCypherMap |
| รายการ | * LaudisNeo4jTypesCypherList |
| จุด | * LaudisNeo4jContractsPointInterface ** |
| วันที่ | * LaudisNeo4jTypesDate |
| เวลา | * LaudisNeo4jTypesTime |
| เวลาท้องถิ่น | * LaudisNeo4jTypesLocalTime |
| วันที่ | * LaudisNeo4jTypesDateTime |
| DateTimezoneid | * LaudisNeo4jTypesDateTimeZoneId |
| สถานที่ท้องถิ่น | * LaudisNeo4jTypesLocalDateTime |
| ระยะเวลา | * LaudisNeo4jTypesDuration |
| โหนด | LaudisNeo4jTypesNode |
| ความสัมพันธ์ | LaudisNeo4jTypesRelationship |
| เส้นทาง | LaudisNeo4jTypesPath |
(*) รายการเหล่านี้สามารถใช้เป็นพารามิเตอร์ในโปรโตคอล Bolt และจะถูกแปลงโดยอัตโนมัติโดยไดรเวอร์เพื่อให้สามารถใช้ใน Cypher
นอกจากตัวอย่างเหล่านี้ DateTimeInterface จะแมปกับ DateTimeZoneId ใน Cypher array ที่ว่างเปล่าหรือรายการจะถูกแปลงเป็น List cypher และ associative array จะถูกแปลงเป็น map
(**) จุดหนึ่งสามารถเป็นหนึ่งในสี่ประเภทที่ใช้ 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 | ใช่ |
| โปรโตคอลสลักเกลียว | ใช่ |
| กลุ่ม | ใช่ |
| ออร่า | ใช่ |
| โปรโตคอลการเขย่า | ใช่ |
| บุ๊กมาร์ก | ใช่ |
(*) จำเป็นต้องใช้โปรโตคอล Bolt
(**) จำเป็นต้องใช้โปรโตคอล HTTP
(***) สามารถติดตั้งเพื่อประสิทธิภาพของโปรโตคอล Bolt ที่ดีที่สุด
หากคุณวางแผนที่จะใช้ไดรเวอร์ HTTP ตรวจสอบให้แน่ใจว่าคุณมีการใช้งาน PSR-7, PSR-17 และ PSR-18 ที่รวมอยู่ในโครงการ หากคุณไม่มีคุณสามารถติดตั้งผ่านนักแต่งเพลง:
composer require nyholm/psr7 nyholm/psr7-server kriswallsmith/buzzเพื่อให้ได้ผลลัพธ์ของโปรโตคอล BOLT และเครื่องแบบ HTTP ผู้ขับขี่จะให้ฟอร์ทเตอร์ผลลัพธ์ (aka hydrators) ไคลเอนต์สามารถกำหนดค่าได้ด้วย Formatters เหล่านี้ คุณสามารถใช้งานของคุณเองได้
ฟอร์แมตเริ่มต้นคือ LaudisNeo4jFormattersOGMFormatter ซึ่งอธิบายอย่างกว้างขวางในส่วนรูปแบบผลลัพธ์
ไดรเวอร์ให้สามฟอร์มอทเตอร์โดยค่าเริ่มต้นซึ่งพบได้ทั้งหมดในเนมสเปซแบบฟอร์แมต:
LaudisNeo4jFormatterBasicFormatter ซึ่งลบประเภท cypher ทั้งหมดและเพียงส่งคืนค่าทุกค่าในแผนที่ผลลัพธ์เป็นสเกลาร์, ค่า NULL หรืออาร์เรย์LaudisNeo4jFormatterOGMFormatter ซึ่งแมปประเภท cypher กับประเภท 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 | การกำหนดเส้นทางฝั่งไคลเอ็นต์ผ่าน Bolt |
| สายฟ้า | สายฟ้า | Bolt+S | Bolt+SSC | เซิร์ฟเวอร์เดียวผ่าน Bolt |
| 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 ();