Настройте 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. Выяснил, что Стратегия — это частная нумерация. Это второй аргумент конструктора, который я пытался предоставить. В моем проекте он никогда не обнаруживал его как стратегию типа.

Сначала я был немного скептичен, потому что Стратегия является частной. Я имею в виду, что я даже не мог создать экземпляр TypeRepresentationStrategyFactory в коде, потому что он не нашел тип Strategy. Вскоре я узнал, что Spring якобы может делать такие вещи: Beans с частным конструктором.

В конце концов мне пришлось скорректировать решение Майкла, так как оно вообще не определяло аргумент конструктора. Что бы я ни делал. Может быть, это моя установка, я действительно не знаю. Но, наконец, я придумал решение для создания bean из закрытого перечисления и предоставить его как ссылку на конструктор:

<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>

person Slomo    schedule 30.05.2012    source источник


Ответы (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>
person Michael Hunger    schedule 31.05.2012
comment
Спасибо. К сожалению, это не работает для меня. Компонент не может быть создан с ошибкой «Не удалось разрешить соответствующий конструктор». Я пробовал без конструктора arg Subref, и это работает. Я даже пытался добавить свойство типа или имени в тег конструктора-аргумента. Это ничего не изменило. Я нашел конструктор: public TypeRepresentationStrategyFactory(GraphDatabase graphDatabaseService,Strategy strategy) и не понимаю, почему он не работает. Это потому, что тип Strategy является закрытым для TypeRepresentationStrategyFactory? - person Slomo; 01.06.2012
comment
@Rob К сожалению, у меня было мало времени для тестирования. В ближайшие дни у меня будет свободное время, и я попробую еще раз. Я бы очень хотел пометить это как «ответ» ;) но я пока не могу этого сделать. - person Slomo; 13.06.2012
comment
Хорошо, если вы можете скинуть код, который у вас есть, на GitHub, я был бы рад помочь. - person Rob Kielty; 13.06.2012
comment
Интересно, т.к. образец кода я взял из конфига работающего Теста. Можешь поделиться своим конфигом? (Возможно, в группе Neo4j Google или Spring Forums) - person Michael Hunger; 14.06.2012
comment
Я создал этот пост на весенних форумах: forum .springsource.org/ - person Slomo; 14.06.2012

Ты можешь это сделать :

<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>
person wedoud    schedule 20.06.2013