2012-06-16 2 views
0

У меня много разных узлов, связанных с отношениями. В этих отношениях я использую некоторые свойства типа Enum, и я пытаюсь выполнить запрос через отношения с использованием языка Cyper и возвращать только те, у кого свойство Enum находится в массиве. Кроме того, отношения, с которыми я пытаюсь выполнить запрос, являются подклассом другого, у которого есть свойство, с которым я хочу выполнить запрос. Вот пример:Данные весны neo4j и запрос с ключевым словом IN

@RelationshipEntity 
public class Mother { 

    @Indexed(level=Level.INSTANCE) Visibility visibility; 
    public Visibility getVisibility() { 
     return visibility; 
    } 
    public void setVisibility(Visibility visibility) { 
     this.visibility = visibility; 
    } 
} 

public class Child extends Mother { 
    @StartNode StartNode start; 
    @EndNode EndNode end; 
} 

Представьте, что видимость является перечислением, которое может быть как частная, сетью или Public. Затем в хранилище я попытался следующие запросы, но он всегда возвращает все или выдает ошибку:

@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility='Private' return r") 
Iterable<Child> findChildren(StartNode start); 
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility=\"Private\" return r") 
Iterable<Child> findChildren(StartNode start); 
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility=Private return r") 
Iterable<Child> findChildren(StartNode start); 

То, что я действительно хотел бы использовать это «IN» оператор, но выдает ошибку, как если бы Бесполезный Не знаю, что такое IN.

@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility in ['Private', 'Network'] return r") 
Iterable<Child> findChildren(StartNode start); 

Является ли моя видимость не проиндексированной? или я не должен это делать? Я не пытался изменить свойство Видимость с помощью строки, которая, я полагаю, должна работать, так как у меня есть другие свойства String, с которыми я могу успешно запросить. Использование оператора «IN» - это бонус!

Редактировать 1: Я использую spring-data-neo4j 2.0.1.RELEASE. Я пытаюсь сделать это в модульном тестировании, используя org.neo4j.test.ImpermanentGraphDatabase, но я просто понял, что запрос @Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility='Private' return r") работает при запуске сервера, используя конфигурацию по умолчанию, но он по-прежнему не работает в модульном тестировании. Кроме того, даже при запуске сервера предложение «IN» по-прежнему вызывает ошибку. Это связано с версией, которую я использую? Я помню, как пытался использовать более новую версию, но потом зависания не удались, возможно, я должен попробовать еще раз.

Редактировать 2: Поэтому я обновил версию spring-data-neo4j до версии 2.1.0.BUILD-SNAPSHOT, обновил версию neo4j до 1.7. Теперь у меня нет ошибки для ключевого слова «IN», но я не знаю, какой синтаксис следует использовать для передачи значений, которые нужно выполнить для поиска. Таким образом, наличие

@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility in [{1}] return r") 
Iterable<Child> findChildren(StartNode start, String visibility); 

работает, если я прохожу по простой строки, как Public, но если я прохожу по Public, Private, который никогда не возвращает ничего, даже если Public делает ответные матчи. Я также попытался изменить параметр String visibility на String[] visibility, но это не работает вообще.

+1

Пожалуйста, используйте 'r.visibility в {1}' без квадратных скобок. –

ответ

0

@Guillaume,

Это делается: https://jira.springsource.org/browse/DATAGRAPH-281

Он доступен в сборки снимков, и будет в SDN 2.1.RC4/GA

С уважением,

Лассе

+0

Формат ваших ответов странный, но теперь он исправлен, поэтому я принял ваш ответ – Guillaume

0

Вы пытались выполнить запросы только отдельно от db? Или с neo4j-shell, neoclipse или сервером? Или программно в единичном тесте? А также проверьте db, если ваши узлы и отношения есть и какие у них свойства.

Индексирование не связано с вашим запросом.

Перечисления хранятся в виде строк в свойствах.

Некоторые примечания:

  • Как создать отношения?
  • частные классы для лиц, вероятно, может вызвать проблемы
  • убедитесь, что тип отношения типа действительно то, что вы используете

Этот пример в neo4j console показывает, что она работает. Какую версию Neo4j вы используете?

+0

Я только что редактировал свой вопрос, чтобы уточнить версию. В качестве примера я помещаю слово TYPE, но это не те классы, которые я использую. И жаль приватных классов, я быстро набрал эти классы для вопроса, потому что мои классы слишком сложны и специфичны для этого, но у вас есть идея! – Guillaume

+0

даже после обновления до последней версии spring-data-neo4j, я до сих пор не понимаю, как использовать ключевое слово IN. Любые примеры? – Guillaume

+0

Ключевое слово IN проверяет наличие значения в коллекции. –

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