Spring Data Neo4j — индексирование и наследование

Допустим, у меня есть следующая модель данных:

public class A {

    @Indexed(indexType = IndexType.FULLTEXT, indexName = "property1")
    String property1;
}

public class B extends A {

    @Indexed(indexType = IndexType.FULLTEXT, indexName = "property2")
    String property2;
}

Могу ли я сказать платформе Spring индексировать property1 класса B под другим именем индекса? Если нет, что бы вы сделали в таком случае? Я имею в виду, что бы вы сделали, если бы у вас было несколько классов, расширяющих один и тот же базовый класс, но в то же время все свойства, которые эти классы наследуют от базового класса, должны быть проиндексированы. Я могу аннотировать эти свойства для индексации только в базовом классе, и это очень ограничивает. Что я могу сделать?

Спасибо.


person gipouf    schedule 30.04.2013    source источник
comment
Какой подход вы выбрали? Пожалуйста, подтвердите один из ответов, если вы их использовали.   -  person tstorms    schedule 07.05.2013
comment
На самом деле я все еще играю с этим, поэтому я до сих пор не принял ответ. Сегодня я углублюсь в предложение Level.INSTANCE, чтобы увидеть, действительно ли оно отвечает моим потребностям, потому что, как я уже писал, я не видел никакого влияния, когда пробовал его в последний раз. Я приму один из ответов сегодня вечером или завтра.   -  person gipouf    schedule 07.05.2013


Ответы (2)


Я не думаю, что это возможно. Ваш property1 всегда будет проиндексирован в индексе property1. Возможность указать несколько индексов в одном поле, вероятно, решит вашу проблему, но в настоящее время это невозможно. Некоторое время назад я поднял проблему по этому поводу, но она еще не реализована.

Если вам действительно нужен объектный подход домена (сущности), вы также можете выбрать подход доменной сущности. Это не связано с Spring или Spring Data Neo4j, но тоже помогает. Обрабатывая таким образом свои объекты вручную, вы также можете самостоятельно управлять индексами, получая таким образом всю необходимую гибкость.

Просто вопрос, почему вы хотите указать другой индекс для каждого подкласса?

person tstorms    schedule 30.04.2013
comment
Что касается вашего последнего вопроса. Возможно, я что-то упустил, но мне это нужно, чтобы иметь возможность выполнять поиск по свойству класса B2 таким образом, чтобы поиск был ограничен только экземплярами/узлами класса B. Может быть, есть другой способ выполнить то, что я хочу? - person gipouf; 30.04.2013
comment
Вы можете просто использовать один и тот же индекс для всех своих свойств. Запрос Lucene может выглядеть как property2:a_certain_value. Например, Cypher это будет выглядеть так: START n=node:your_index(property2:a_certain_value) RETURN n - person tstorms; 30.04.2013
comment
но в моем случае индекс с именем свойство2 будет содержать экземпляры класса А и класса В или любого другого класса, наследуемого от А, потому что во всех этих классах свойство2 связано с индексом с именем свойство2. Я хочу, чтобы свойство2 каждого класса использовало другой индекс, чтобы я мог искать экземпляры каждого типа отдельно и при этом сохранять аккуратный дизайн ООП. - person gipouf; 30.04.2013
comment
Все еще не совсем получаешь то, что на самом деле хочешь. Image есть один индекс, который вы будете использовать для каждого свойства относительно его класса. Если вы хотите получить узел типа B, вам поможет запрос типа property2:abc. Изображение есть класс C, который расширяется от A со свойством, называемым property3. Такой запрос, как property3:abc, снова сделает свое дело. Возможно, я что-то упустил, но, по сути, я не думаю, что с этим подходом что-то не так (или почему вы действительно хотели бы сделать это иначе). - person tstorms; 30.04.2013
comment
так что я должен просто добавить еще одно свойство, которое содержит тип узла? (и, следовательно, тип класса, который представляет этот узел). Считается ли это хорошей практикой? - person gipouf; 30.04.2013
comment
Кстати, всегда есть возможность сделать запрос на основе имени класса. Они также автоматически индексируются. Начните свой шифрованный запрос с START n=node:__types_(className:A). - person tstorms; 30.04.2013
comment
Отвечая на ваш вопрос, это уже так. Каждый узел имеет свойство __type__, которое содержит полное имя класса. Если вы хотите использовать это свойство в шифровальном запросе, обязательно окружите его обратными кавычками. - person tstorms; 30.04.2013

Атрибуту level в аннотации определения индекса можно присвоить значение Level.INSTANCE. Для получения дополнительной помощи обратитесь к документации spring-data-neo4j здесь

Вот выдержка из документа:

Если поле объявлено в суперклассе, но необходимы разные индексы для подклассов, атрибут уровня объявляет, что будет использоваться в качестве индекса. Level.CLASS использует класс, в котором было объявлено поле, а Level.INSTANCE использует предоставленный класс или фактический экземпляр объекта.

person Gopi    schedule 30.04.2013
comment
Я пытался его использовать, но не вижу никаких отличий, похоже, что индекс все еще находится на уровне класса. А можно небольшой пример как его использовать, кроме расширения аннотации свойством УРОВЕНЬ? я что-то пропустил? я не мог получить больше информации в документации. - person gipouf; 30.04.2013
comment
Да, я почти не нашел примеров его использования. В этом обсуждении, кажется, упоминается forum.springsource.org / - person Gopi; 01.05.2013