بادئ ذي بدء ، نشأت المهمة لإنشاء طلبات @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 ، إذا لزم الأمر.
سوف تصف المقالات التالية منشئ الاستعلام نفسه ، ومعلماته ، وآلية عمله ، والمشاكل التي واجهتها وحلها.