من حسین کورائی در این مقاله قصد دارم به اختصار به نحوهی پیادهسازی Neo4j و استفاده از GraphQl در پروژه خود بپردازم. در صورتیکه با مفاهیم نام برده آشنا نیستید پیشنهاد میکنم پیش از خواندن این مثال، حتماً مقالههای Neo4j و GraphQl را مشاهده نمایید.
مقدمه Neo4j
ما در این مقاله از زبان جاوا و فریم ورک spring برای پیادهسازی استفاده میکنیم. راهنماییهای لازم جهت دانلود، نصب و کانفیگ Neo4j را میتوانید از سایت آن بگیرید. همچنین از نرمافزار Neo4j Browser که برای سادهسازی کار با دیتا استفاده میشود، بهره بردیم. شما میتوانید نسخههای متناسب با نیاز خود را از لینک دانلود نمایید.
شرح مثال
در این مثال میخواهیم نشان دهیم هر شرکت خودروسازی چه خودروهایی تولید نموده و هر خودرو چه اسپانسری دارد. همچنین هر اسپانسر جداگانه میتواند مالک یک خودرو باشد.
مرحله اول Neo4j
ابتدا وابستگیهای مورد نیاز را به پروژه خود اضافه میکنیم.
spring-boot-starter-data-neo4j neo4j-ogm-test neo4j-ogm-embedded-driver neo4j-java-driver-spring-boot-starter
مرحله دوم Neo4j
کلاسهای خود را مشخص کرده و با @Node آنها را به عنوان Node در نظر میگیریم.
کلاس Company :
@Node public class Company { @Id private long id; private String name; @Relationship(type = "OWN_IN", direction = Relationship.Direction.OUTGOING) private List<Car> carList; public Company(long id, String name, List<Car> carList) { this.id = id; this.name = name; this.carList = carList; } public long getId() { return id; } public String getName() { return name; } public List<Car> getCarList() { return carList; } }
کلاس Car :
@Node public class Car { @Id private long id; private String name; private int year; @Relationship(type = "OWN_ENGINE", direction = Relationship.Direction.OUTGOING) private List<Engine> engines; public Car(long id, String name, int year, List<Engine> engines) { this.id = id; this.name = name; this.year = year; this.engines = engines; } public long getId() { return id; } public String getName() { return name; } public int getYear() { return year; } public List<Engine> getEngines() { return engines; } }
و کلاس Sponsor :
@Node public class Sponsor { @Id private long id; private String name; @Relationship(type = "OWN_CAR", direction = Relationship.Direction.OUTGOING) private List<Car> carList; public Sponsor(long id, String name, List<Car> carList) { this.id = id; this.name = name; this.carList = carList; } public long getId() { return id; } public String getName() { return name; } public List<Car> getCarList() { return carList; } }
مرحله سوم Neo4j
در این مرحله سعی میکنیم با دیتای درون برنامه اعمال CRUD انجام دهیم.
@Repository public interface CarRepository extends Neo4jRepository<Car, String> { Car findByName(String name); @Query("MATCH(n:Car START WITH {$pattern}) RETURN n") List<Car> findByPatternName(@Param("pattern") String pattern); }
همانطور که مشاهده میکنید برای پیدا کردن یک نود و یا لیستی از نود ها میتوانید از دو روش استفاده نمایید. روش اول استفاده از امکانی که Neo4j در اختیار ما قرار داده و تنها با درج نام تابع به این صورت findByName نود هدف را با ورودی نام آن مییابد. در صورتیکه دو نود دارای نام یکسانی باشند، اولین نود یافت شده را بازگردانی میکند. روش دوم استفاده از @Query است. در این روش که دقیقتر و کاملتر است میتوانیم نود هدف خود را بیابیم. که در مقالههای بعد مفصل در خصوص کوئری زدن در Neo4j صحبت خواهیم کرد.
برای پیادهسازی سایر اعمال مانند اضافهکردن نود و حذف آن، در لایه سرویس از توابع save و delete استفاده میکنیم. برای درک بهتر، لطفاً قطعه کد زیر را مشاهده نمایید.
@Service public class CarService { @Autowired private CarRepository carRepository; private void add( long id, String name, int year, List<Sponsor> sponsors ){ Car car = new Car( id, name, year, sponsors ); carRepository.save(car); } private void delete(String id){ carRepository.deleteById(id); } }
شما میتوانید پروژه مربوطه را از لینک گیت هاب دریافت نمایید.
و در آخر
وبسایت میربزرگی قصد دارد تا با ارائه مقاله ها و تجربههای کاربردی شما را در زمینه یادگیری و رفع اشکالاتتان کمک کند. در صورت وجود هرگونه سوالی به من ایمیل بزنید.