إنشاء مولد استعلامات مخصص في بيانات الربيع Neo4j (الجزء 1)

بادئ ذي بدء ، نشأت المهمة لإنشاء طلبات @NodeEntity لفئات البيانات استنادًا إلى @Relationship و @Relationship و @Relationship والمعلمات الإضافية. تمت كتابة منشئ الاستعلام ، ولكن تم حساب سلسلة الاستعلام في وقت التشغيل ولم نتمكن من استخدامها كمعلمة @Query التوضيحي الحالي @Query ، لذلك تمت إضافة تعليق توضيحي جديد @CustomQuery ، استخدم المعالج @CustomQuery استعلام مكتوب.


إصدارات البرامج المستخدمة:


spring-data-neo4j - 5.0.9.RELEASE
neo4j - 3.4.6
neo4j-ogm - 3.1.4


إضافة مولد استعلام مخصص إلى Spring Data Neo4j


لإضافة آليتك الخاصة لإنشاء طلبات cypher لطرق مستودع neo4j المميزة ، على سبيل المثال ، مع التعليق التوضيحي @CustomQuery ، تحتاج إلى إنشاء CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory تعريف استعلام CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy


 @Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); } 

من الضروري أيضًا توسيع فئة Neo4jRepositoryFactoryBean القياسية Neo4jRepositoryFactoryBean فئة CustomNeo4jRepositoryFactoryBean الجديدة وتجاوز طريقة createRepositoryFactory . يجب أن يعيد مثيل مصنع المستودع الجديد:


 @Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); } 

لجعل Spring Data Neo4j يفهم أي من فاصوليا مستودع التخزين المراد استخدامه ، يجب تحديده بشكل صريح في التعليق التوضيحي @EnableNeo4jRepositories في التكوين:


 @EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class) 

تم CustomQuery تعليق توضيحي استعلام CustomQuery إضافي. إذا تم وضع علامة على طريقة مستودع التخزين مع هذا التعليق التوضيحي ، CustomGraphQueryLookupStrategy في الأسلوب resolveQuery بإرجاع كائن طلبنا CustomGraphRepositoryQuery extends GraphRepositoryQuery :


 public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, ProjectionFactory factory, NamedQueries namedQueries) { if (method.isAnnotationPresent(CustomQuery.class)) { GraphQueryMethod queryMethod = new GraphQueryMethod(method, metadata, factory); return new CustomGraphRepositoryQuery(queryMethod, session, method.getAnnotation(CustomQuery.class)); } else { return super.resolveQuery(method, metadata, factory, namedQueries); } } 

يطبق getQuery أسلوب getQuery يُرجع كائن Query ؛ يقبل مُنشئه استعلام CustomGraphRepositoryQuery الذي تم إنشاؤه في CustomGraphRepositoryQuery استنادًا إلى البيانات من تعليق توضيحي CustomQuery Method المميز بهذا التعليق التوضيحي:


 @Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); } 

resolveParametres(Object[]) وطريقة resolveParametres(Object[]) المستخدمة من GraphRepositoryQuery خاصة في GraphRepositoryQuery ، لذلك تم نسخهم ببساطة إلى CustomGraphRepositoryQuery (يمكنك استخدام الانعكاس ، لن يؤثر هذا على الأداء ، لأن توليد الاستعلام يحدث قبل وقت التشغيل).


الخاتمة


وبالتالي ، يمكنك إعلان الآلية الخاصة بك لإنشاء طلبات cypher ، إذا لزم الأمر.


سوف تصف المقالات التالية منشئ الاستعلام نفسه ، ومعلماته ، وآلية عمله ، والمشاكل التي واجهتها وحلها.

Source: https://habr.com/ru/post/ar434902/


All Articles