Вопрос по neo4j – Spring Data Neo4j - проблемы @RelationshipType

3

У меня возникают трудности с поиском отношений, когда тип отношения помечен значком@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так что я вполне могу делать что-то смешно неправильно. Я надеюсь, что это так!

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

Ваш Ответ

1   ответ
2

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

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

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

На самом деле @Michael, реализация моего варианта использования была слишком наивной и слишком сильно зависела от структуры данных существующей унаследованной системы, которая поддерживалась реляционной базой данных. Хранение нескольких типов отношений в одной и той же двунаправленной коллекции не имеет никакого смысла ни для моего варианта использования обхода, ни для моей базовой структуры данных. Я мог бы поднять JIRA независимо, в случае, если разнородные коллекции полезны для кого-то еще. nullPainter
Я должен был уточнить в моем первом комментарии -Entity классы подклассы, чтобы обеспечить дополнительные поля, однакоRelationship класс одинаков для всех. Итак, мы могли бы иметьAgency & Lt; -Relationship - & GT;Series, Agency & Lt; -Relationship - & GT;Agencyи т. д. Итак, каждый из типов отношений между сущностями имеет общийRelationship класс как реляционные метаданные. nullPainter
Большое спасибо. У нас было еще несколько вариантов использования, когда люди хотели хранить полиморфные данные на объектах отношений и использовать для них динамические rel-типы. Так что сейчас в JIRA и над этим ведутся работы.
Я посмотрел наtemplate.getRelationshipsBetween, который работает хорошо. Однако я пытаюсь создать обозреватель данных / графиков - пользователь выбирает объект из результатов поиска, а обозреватель отображает объект и связанные с ним объекты до двух глубин. Выбор связанной сущности сосредотачивается на этой сущности и т. Д. Таким образом, сценарий использования ни в какой момент не указывает явное знание связанных сущностей для предварительного запроса. Я полагаю, что альтернативой является просто использование отношения RELATED_TO 'type' apos; и сохранить специфику в стандартном поле. nullPainter
Спасибо, Майкл, я так и подозревала. Единственной причиной, по которой я не создаю отдельные классы для своих отношений, является элегантность с точки зрения Java. я имеюEntity& Lt; -Relationship - & GT;Entity доменные объекты, сRelationship содержащие метаданные года. Существует около восьми типов двунаправленных отношений между каждым подклассом сущности ("Агентство - серия CONTROLLED_BY, серия - также агентство CREATED_BY, серия - серия GOVERNED_BY и т. Д.). Создание восьми разныхRelationship объекты и восемь разных карт немного неловко, если классы идентичны. nullPainter

Похожие вопросы