Настройте TypeRepresentationStrategy для Neo4j
В настоящее время мы работаем над проектом Java с neo4j.
Мы используем Spring Data Neo4j и получаем большую часть информации из книги " Хорошие отношения".
В этом документе говорится, что стандартным представлением типа сущности в графе является IndexingNodeTypeRepresentationStrategy.
Для нашего проекта мы бы предпочли тот, с узлами субреференции.
Как мы можем настроить neo4j для использования этой стратегии при работе с репозиториями. Мы начали с примера HelloWorld, поэтому в настоящее время у нас есть интерфейс репозитория:
public interface IWebsiteGraphRepository extends GraphRepository<Website> {}
Кроме того, у нас есть сущность нашего узла (я опускаю большую часть ненужного кода):
@NodeEntity
public class Website {
...
}
Кто-нибудь может привести небольшой пример того, как установить TypeRepresentationStrategy?
Можно ли это сделать в конфигурации Spring?
Конфиг будет:
<context:annotation-config />
<tx:annotation-driven mode="aspectj" transaction-manager="neo4jTransactionManager" />
<context:component-scan base-package="my.base">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<neo4j:config storeDirectory="target/neo4j-db" />
<neo4j:repositories base-package="my.base.packages.repositories" />
Редактировать:
После очередной сессии я наконец смог заставить ее работать! Я начал, основываясь на ответе Майкла Хангерса, но не смог создать Боб. Я нашел, откуда его пример: gitHub. Это, однако, все еще не работает для меня. Я начал глубже изучать исходный код класса TypeRepresentationStrategyFactory. Я узнал, что Стратегия - это частное перечисление. Это второй конструктор, который я пытался представить. В моем проекте он никогда не обнаруживал это как тип Strategy.
Сначала я был немного скептиком, потому что стратегия является частной. Я имею в виду, что я даже не смог создать экземпляр TypeRepresentationStrategyFactory в коде, потому что он не нашел бы тип Strategy. Вскоре я узнал, что Spring якобы может делать такие вещи: Beans с приватным конструктором.
В конце концов мне пришлось скорректировать решение Майклса, так как оно не идентифицировало аргумент конструктора. Неважно, что я сделал. Может быть, это моя установка, я действительно не знаю. Но, наконец, я пришел к решению создать бин из частного перечисления и предоставить его как ссылку на конструктор:
<bean id="subref" factory-method="valueOf"
class="org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory.Strategy">
<constructor-arg>
<value>SubRef</value>
</constructor-arg>
</bean>
<bean id="typeRepresentationStrategyFactory"
class="org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory">
<constructor-arg index="0" ref="delegatingGraphDatabase" />
<constructor-arg index="1" ref="subref" />
</bean>
2 ответа
Это должно сделать:
<bean id="typeRepresentationStrategyFactory" class="org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory">
<constructor-arg index="0" ref="graphDatabaseService"/>
<constructor-arg index="1" value="SubRef"/>
</bean>
Вы можете сделать это:
<bean id="typeRepresentationStrategyFactory" class="org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory">
<constructor-arg index="0" ref="graphDatabaseService"/>
<constructor-arg index="1">
<value type="org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory.Strategy">SubRef</value>
</constructor-arg>
</bean>