Kerumitan pertanyaan, kesan prestasi meningkat dengan bilangan rakan/pengikut dan kesukaran untuk mengembangkan model sosial anda adalah titik yang data grafik menghapuskan.
Dalam tutorial ini, kami akan melanjutkan aplikasi demo yang digunakan oleh dua artikel pengenalan mengenai Neo4J dan PHP, masing -masing:
Anda akan menemui teknik pemodelan tertentu yang dipanggil senarai yang dipautkan dan beberapa pertanyaan lanjutan dengan cypher.
Kod sumber untuk artikel ini boleh didapati dalam repositori GitHub sendiri.
memodelkan garis masa dalam pangkalan data graf
Berikut adalah perwakilan yang mudah:
Walaupun model sedemikian akan berfungsi tanpa sebarang masalah, terdapat beberapa kelemahan kepadanya:
Node dalam pangkalan data graf memegang rujukan kepada sambungan yang dia ada, menyediakan prestasi cepat untuk traversals graf.
Teknik pemodelan biasa untuk suapan pengguna dipanggil senarai yang dipautkan. Dalam aplikasi kami, nod pengguna akan mempunyai hubungan yang dinamakan last_post ke jawatan terakhir yang dibuat oleh pengguna. Catatan ini akan mempunyai hubungan sebelumnya_post dengan yang sebelumnya yang juga mempunyai sebelumnya_post ke jawatan terdahulu kedua dan lain -lain ...
Lebih penting lagi, apa yang pengguna lakukan dalam masa dimodelkan secara semulajadi dalam pangkalan data graf. Mampu menyimpan data dengan cara yang sepadan dengan bagaimana data ini tinggal di luar pangkalan data adalah manfaat sebenar untuk analisis, mencari dan memahami data anda.
Persediaan Awal
<span>git clone git@github.com:sitepoint-editors/social-network </span><span>mv social-network social-timeline </span> <span>cd social-timeline </span><span>rm -rf .git </span><span>composer install </span>bower <span>install</span>
Anda perlu mempunyai pangkalan data yang sedang berjalan (tempatan atau jauh), pergi ke pautan ini, klik pada Generate dan kemudian pada "Populasi pangkalan data anda".
Jika anda menggunakan NEO4J 2.2, anda perlu menyediakan nama pengguna NEO4J dan kata laluan anda dalam kotak populator Graphgen:
Ini akan mengimport 50 pengguna dengan log masuk, nama pertama dan nama belakang. Setiap pengguna akan mempunyai dua catatan blog, satu dengan hubungan last_post dengan pengguna dan satu dengan hubungan sebelumnya_post dengan suapan yang lain.
Jika anda kini membuka penyemak imbas NEO4J, anda dapat melihat bagaimana pengguna dan jawatan dimodelkan:
memaparkan suapan pengguna
Pertama, kami akan menambah laluan untuk memaparkan suapan pengguna tertentu. Tambahkan bahagian kod ini ke hujung fail web/index.php
<span>git clone git@github.com:sitepoint-editors/social-network </span><span>mv social-network social-timeline </span> <span>cd social-timeline </span><span>rm -rf .git </span><span>composer install </span>bower <span>install</span>
kami akan memetakan laluan ke tindakan dalam fail SRC/CONTROLLER/WEBCONTROLLER.PHP.
Dalam tindakan ini, kami akan mengambil suapan pengguna yang diberikan dari pangkalan data NEO4J dan lulus mereka ke templat bersama dengan nod pengguna.
<span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts') </span> <span>->bind('user_post');</span>
beberapa penjelasan:
<span>public function showUserPosts(Application $application, Request $request) </span> <span>{ </span> <span>$login = $request->get('user_login'); </span> <span>$neo = $application['neo']; </span> <span>$query = 'MATCH (user:User) WHERE user.login = {login} </span><span> MATCH (user)-[:LAST_POST]->(latest_post)-[PREVIOUS_POST*0..2]->(post) </span><span> RETURN user, collect(post) as posts'; </span> <span>$params = ['login' => $login]; </span> <span>$result = $neo->sendCypherQuery($query, $params)->getResult(); </span> <span>if (null === $result->get('user')) { </span> <span>$application->abort(404, 'The user $login was not found'); </span> <span>} </span> <span>$posts = $result->get('posts'); </span> <span>return $application['twig']->render('show_user_posts.html.twig', array( </span> <span>'user' => $result->getSingle('user'), </span> <span>'posts' => $posts, </span> <span>)); </span> <span>}</span>
<span><span><span><p</span>></span><span><span><a</span> href<span>="{{ path('user_post', {user_login: user.property('login') }) }}"</span>></span>Show posts<span><span></a</span>></span><span><span></p</span>></span></span>
Pameran Pengguna , anda dapat melihat bahawa siaran kami dipaparkan dengan baik dan diperintahkan dengan menurun masa tanpa menentukan harta tarikh.
memaparkan garis masa
Apabila anda mendapat semua siaran ini, anda perlu menapisnya dengan masa untuk memerintahkan mereka antara pengguna.
Laluan Garis Masa Pengguna
Proses ini adalah sama dengan yang sebelumnya - kami menambah laluan ke index.php, kami membuat tindakan pengawal kami, kami menambah pautan ke garis masa dalam templat profil pengguna dan kami membuat templat garis masa pengguna kami.
Tindakan pengawal:
{% extends "layout.html.twig" %} {% block content %} <span><span><span><h1</span>></span>Posts for {{ user.property('login') }}<span><span></h1</span>></span> </span> {% for post in posts %} <span><span><span><div</span> class<span>="row"</span>></span> </span> <span><span><span><h4</span>></span>{{ post.properties.title }}<span><span></h4</span>></span> </span> <span><span><span><div</span>></span>{{ post.properties.body }}<span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><hr</span>/></span> </span> {% endfor %} {% endblock %}
penjelasan mengenai pertanyaan:
<span>$app->get('/user_timeline/{user_login}', 'Ikwattro\SocialNetwork\Controller\WebController::showUserTimeline') </span> <span>->bind('user_timeline');</span>
pertama kita sepadan dengan pengguna kita.
dan buat templat garis masa:
<span>public function showUserTimeline(Application $application, Request $request) </span> <span>{ </span> <span>$login = $request->get('user_login'); </span> <span>$neo = $application['neo']; </span> <span>$query = 'MATCH (user:User) WHERE user.login = {user_login} </span><span> MATCH (user)-[:FOLLOWS]->(friend)-[:LAST_POST]->(latest_post)-[:PREVIOUS_POST*0..2]->(post) </span><span> WITH user, friend, post </span><span> ORDER BY post.timestamp DESC </span><span> SKIP 0 </span><span> LIMIT 20 </span><span> RETURN user, collect({friend: friend, post: post}) as timeline'; </span> <span>$params = ['user_login' => $login]; </span> <span>$result = $neo->sendCypherQuery($query, $params)->getResult(); </span> <span>if (null === $result->get('user')) { </span> <span>$application->abort(404, 'The user $login was not found'); </span> <span>} </span> <span>$user = $result->getSingle('user'); </span> <span>$timeline = $result->get('timeline'); </span> <span>return $application['twig']->render('show_timeline.html.twig', array( </span> <span>'user' => $result->get('user'), </span> <span>'timeline' => $timeline, </span> <span>)); </span> <span>}</span>
kami kini mempunyai garis masa yang cukup sejuk yang menunjukkan 20 suapan terakhir orang yang anda ikuti yang cekap untuk pangkalan data.
ricky . Anda perlu membuat nod pos, keluarkan hubungan last_post dari pengguna ke Latest_Post lama, buat hubungan baru antara node post yang terakhir dan pengguna dan akhirnya membuat hubungan sebelumnya_post antara node post yang baru dan lama.
mudah, bukan? Mari kita pergi!Seperti biasa, kami akan membuat laluan pos untuk borang yang menunjuk kepada tindakan WebController:
<span>git clone git@github.com:sitepoint-editors/social-network </span><span>mv social-network social-timeline </span> <span>cd social-timeline </span><span>rm -rf .git </span><span>composer install </span>bower <span>install</span>
<span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts') </span> <span>->bind('user_post');</span>
<span>public function showUserPosts(Application $application, Request $request) </span> <span>{ </span> <span>$login = $request->get('user_login'); </span> <span>$neo = $application['neo']; </span> <span>$query = 'MATCH (user:User) WHERE user.login = {login} </span><span> MATCH (user)-[:LAST_POST]->(latest_post)-[PREVIOUS_POST*0..2]->(post) </span><span> RETURN user, collect(post) as posts'; </span> <span>$params = ['login' => $login]; </span> <span>$result = $neo->sendCypherQuery($query, $params)->getResult(); </span> <span>if (null === $result->get('user')) { </span> <span>$application->abort(404, 'The user $login was not found'); </span> <span>} </span> <span>$posts = $result->get('posts'); </span> <span>return $application['twig']->render('show_user_posts.html.twig', array( </span> <span>'user' => $result->getSingle('user'), </span> <span>'posts' => $posts, </span> <span>)); </span> <span>}</span>
Kami mula -mula sepadan dengan pengguna, maka kami secara pilihan memadankan nod last_postnya.
Kesimpulan
Soalan Lazim (Soalan Lazim) Mengenai Garis Masa Pengguna yang cekap dalam Aplikasi PHP dengan Neo4J
Bagaimanakah saya dapat memvisualisasikan data garis masa saya di Neo4J? Alat ini membolehkan anda membuat garis masa interaktif, dinamik, dan visual yang menarik. Anda boleh menyesuaikan garis masa untuk memenuhi keperluan anda, menambah acara, dan juga menghubungkannya dengan acara lain. Ini memudahkan untuk memahami hubungan dan corak dalam data anda.
Bagaimana PHP berkembang selama bertahun -tahun? Ia bermula sebagai bahasa skrip mudah untuk pembangunan web tetapi telah berkembang menjadi bahasa pengaturcaraan penuh dengan sokongan untuk pengaturcaraan berorientasikan objek, pengaturcaraan berfungsi, dan banyak lagi. Setiap versi baru PHP membawa penambahbaikan prestasi, keselamatan, dan ciri -ciri. beberapa strategi. Ini termasuk mengoptimumkan pertanyaan cypher anda, menggunakan indeks untuk mempercepat pengambilan data, dan menguruskan sambungan pangkalan data anda dengan cekap. Di samping itu, anda harus sentiasa menggunakan versi terkini PHP dan NEO4J untuk prestasi terbaik. Ini termasuk menggunakan sambungan pangkalan data yang selamat, membersihkan input pengguna untuk mencegah serangan suntikan, dan melaksanakan pengendalian ralat yang betul. Di samping itu, anda harus sentiasa menyimpan perisian PHP dan Neo4J anda sehingga kini mendapat manfaat daripada patch keselamatan terkini. Aplikasi PHP dengan NEO4J boleh dilakukan dengan menggunakan blok percubaan. Ini membolehkan anda menangkap apa -apa pengecualian yang berlaku semasa pelaksanaan kod anda dan mengendalikannya dengan sewajarnya. Anda juga boleh menggunakan pembalakan ralat untuk menjejaki sebarang isu yang berlaku. Ini termasuk menggunakan ciri kluster NEO4J untuk mengedarkan data anda merentasi pelbagai pelayan, mengoptimumkan skema pangkalan data anda dan pertanyaan untuk prestasi, dan menggunakan caching untuk mengurangkan beban pangkalan data.
Atas ialah kandungan terperinci Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!