2016-01-24 2 views
3

КОНТЕКСТ: Я разрабатываю систему загрузки java Spring, поддерживаемую базой данных neo4j. Я обращаюсь к базе данных, используя структуру «ClassRepo extends GraphRepository». Написание запросов - это простой случай жесткого кодирования в моем точном запросе и замена указанной части его на поставляемый параметр (в данном случае - имя курса).Возможно ли динамически построить запрос nep4j cypher с использованием шаблона GraphRepository

@Query("MATCH (node:Course) WHERE node.name = {courseName} RETURN node LIMIT 1") 
Course findByName(@Param("courseName") String name); 

Это все сработало для меня, что позволило мне вернуть один или несколько результатов без проблем. Тем не менее, по мере развития моего проекта, теперь я предлагаю большой список вариантов поиска по (фасетный поиск, думаю, фильтры продуктов amazon). Кажется глупым писать статический шифрованный запрос для каждой перестановки выбранных или не выбранных параметров фильтрации.

Мое решение (попытка) было передать в части запроса в качестве параметров, в сущности, делает строитель Строка запроса:

@Query("MATCH (course:Course) -[r]-> (description:CourseYearDescription) " + 
     "WITH course, count(description) as relationCount, collect(description) as descriptions " + 
     "WHERE relationCount > {numberOfYears} {returnCourse}") 
Iterable<Course> findCourseWithNumberOfYears(
     @Param("numberOfYears") int numberOfYears, 
     @Param("returnCourse") String returnCourse 
); 

Где «returnCourse» представляет собой строку со значением «RETURN конечно». Я знаю, что «RETURN course» введен статически в строке запроса. Я только что удалил его и передал строковое значение в качестве параметра, чтобы увидеть, может ли он генерировать тот же запрос и запускать его во время выполнения.

Это не имело никакого реального успеха, возвращая меня на страницу с ошибкой и распечатыванием следующего стека: http://pastebin.com/J9VBfpxw

ВОПРОС: Есть ли способ, чтобы добавить/вставить строки в Cypher строку запроса, используемой в GraphRepository, так что запрос может быть изменен динамически, т. е. добавить предложение where в конец запроса соответствия во время выполнения.

ответ

5

Нет, нет. SDN/Neo4j OGM не будет изменять пользовательские запросы во время выполнения и просто передает их для запуска движком Cypher. Следовательно, единственное, что вы можете параметризовать, это те, которые Cypher позволит вам (http://neo4j.com/docs/stable/cypher-parameters.html).

Согласитесь, что нет смысла определять несколько операторов @Query для каждого варианта, но то, что вы можете сделать, это построить ваш запрос в виде строки и использовать методы Neo4jOperations.query *, которые будут принимать ваши динамически сгенерированные запросы Cypher и карту параметров (опять же, параметры, которые действительны в операторе Cypher).

Надеюсь, что это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^