Настройте 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>
Другие вопросы по тегам