Spring Data Neo4j — проблемы @RelationshipType

У меня возникают трудности с получением отношений, когда тип отношения аннотирован полем @RelationshipType.

Отношения в Neoclipse выглядят правильно, но я не получаю результатов в своем приложении.

Код, который не работает (упрощенный):

@NodeEntity
public abstract class Entity {

    @RelatedToVia
    private Collection<Relationship> relationships;

    public Relationship relatedTo(Entity entity, String type) {
        Relationship relationship = new Relationship(type, this, entity);
        relationships.add(relationship);

        return relationship;
    }

    ...
}

а также:

@RelationshipEntity
public class Relationship {

    @RelationshipType
    private String type;

    ...
 }

Код, который работает:

@RelationshipEntity(type = "something")
public class Relationship {

   ...
}

Однако это не подходит для моего варианта использования (у меня есть куча разных типов Relationship между произвольными комбинациями экземпляров Entity.

Полный тестовый код приведен ниже. Agency и Item являются подклассами Entity.

// Create first entity
Agency arnz = agencyRepository.save(new Agency());
arnz.setCode("ARNZ");
agencyRepository.save(arnz);

// Create second entity
Item r123 = itemRepository.save(new Item());
r123.setCode("R123");

// Create parent/child relationship between entities
r123.relatedTo(arnz, EntityRelationshipType.PARENT);
itemRepository.save(r123);

// Retrieve entity from database
Entity entity = itemRepository.findByCode("R123");

// Verify that relationship is present
assertThat(entity.getRelationships().iterator().hasNext(), is(true));

Последняя строка — это место, где тест терпит неудачу. Любые подсказки?

M

PS. Я любитель с Neo4j и случайно нашел @RelationshipType, так что я вполне могу делать что-то смехотворно неправильное. Я надеюсь, что это так!


person nullPainter    schedule 02.06.2012    source источник
comment
Дальнейшие эксперименты показывают, что itemRepository.getRelationshipBetween(r123, arnz, Relationship.class, EntityRelationshipType.PARENT); возвращает отношение, как и ожидалось. Однако, опять же, это не то, что требует мой вариант использования, поэтому он не очень полезен!   -  person nullPainter    schedule 03.06.2012
comment
Кроме того, следуя приведенному выше тестовому коду, Node node = template.getNode(entity.getId()); и последующий вызов node.getRelationships(); также правильно возвращают отношение, только в менее полезном типе node4j raw Relationship. Итак, явно проблема реализации Spring Data, а не что-то принципиально неправильное в моем графике?   -  person nullPainter    schedule 03.06.2012
comment
И это сработает, если я изменю аннотацию в коллекции на @RelatedToVia(direction = Direction.BOTH, type = EntityRelationshipType.PARENT) (т. е. добавлю type). Что опять же не очень полезно, поскольку мне нужен разнородный набор типов отношений в одной коллекции. Или это просто ограничение фреймворка? Я использую 2.1.0.BUILD-SNAPSHOT.   -  person nullPainter    schedule 03.06.2012
comment
Должен быть в настоящее время, вы можете попробовать, если это работает для вас?   -  person Michael Hunger    schedule 08.08.2012


Ответы (1)


Извините, что разочаровал вас, но во время поиска код прямо сейчас ищет не класс типа, а скорее тип из @RelatedToVia или @RelationshipEntity или имя поля relationships как тип отношения. Но вы делаете правильное замечание, не могли бы вы поднять вопрос в JIRA?

Вы смотрели в template.getRelationshipsBetween ?

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

person Michael Hunger    schedule 03.06.2012
comment
Спасибо, Михаил, я так и подозревал. Единственная причина, по которой я не создаю отдельные классы для своих отношений, — это элегантность с точки зрения Java. У меня есть Entity‹-- Relationship --› Entity объекты домена, причем Relationship содержит метаданные года. Существует около восьми типов двунаправленных отношений между каждым подклассом Entity (агентство — это серия CONTROLLED_BY, серия — это также агентство CREATED_BY, серия — это серия GOVERNED_BY и т. д.). Создание восьми разных объектов Relationship и восьми разных карт немного неудобно, если в остальном классы идентичны. - person nullPainter; 04.06.2012
comment
Я посмотрел на template.getRelationshipsBetween, который работает хорошо. Однако я пытаюсь создать проводник данных/графика - пользователь выбирает объект из результатов поиска, и проводник отображает объект и связанные с ним объекты до двух глубин. Выбор связанной сущности сосредотачивается на этой сущности и т. д. Таким образом, вариант использования ни в коем случае не указывает явное знание связанных сущностей для предварительного запроса. Я полагаю, что альтернативой является просто использование «типа» отношения RELATED_TO и сохранение особенностей в стандартном поле. - person nullPainter; 04.06.2012
comment
Я должен был уточнить в своем первом комментарии - классы Entity являются подклассами для предоставления дополнительных полей, однако класс Relationship одинаков для всех. Таким образом, мы могли бы иметь Agency ‹-- Relationship --› Series, Agency ‹-- Relationship --› Agency и т. д. Таким образом, каждый из типов отношений между сущностями имеет общий класс Relationship в виде реляционных метаданных. - person nullPainter; 04.06.2012
comment
На самом деле, @Michael, реализация моего варианта использования была слишком наивной и на нее слишком сильно повлияла структура данных существующей устаревшей системы, которая поддерживалась реляционной базой данных. Хранение нескольких типов отношений в одной и той же двунаправленной коллекции действительно не имеет смысла ни для моего варианта использования обхода, ни для моей базовой структуры данных. Я мог бы поднять JIRA в любом случае, если разнородные коллекции полезны для кого-то еще. - person nullPainter; 05.06.2012
comment
Большое спасибо. У нас было еще несколько вариантов использования, когда люди хотели хранить полиморфные данные о сущностях отношений и использовать для них динамические rel-типы. Так что теперь он находится в JIRA и над ним работают. - person Michael Hunger; 14.06.2012