Возврат NodeEntity из neo4j не содержит отношений или связанных узлов - PullRequest
0 голосов
/ 04 июля 2019

Я настраиваю POC, используя Neo4j, а технически имеет все, что мне нужно, но хотелось бы, чтобы оно было настроено правильно.

В качестве краткого обзора - я могу создавать узлы и отношения и обходить график (т.е. возвращать все функции, доступные на конкретном рынке), поэтому я знаю, что эти узлы / отношения были созданы.

Однако, когда я запрашиваю просто вернуть узел на основе идентификатора, он возвращает ТОЛЬКО данные для этого узла, а не любые отношения или связанные узлы, например, рынки, на которых он доступен.

Я посмотрелв различных местах в сети, где возвращаются не только узлы, но и последующие узлы - хотя я слежу за тем, что они делают, я не могу заставить его работать с моим.

Репозиторий функций:

    @Repository
    public interface FeatureRepository<T extends Feature> extends Neo4jRepository<T, Long> {
    ...
    }

Цветовой репозиторий:

    @Repository
    public interface ColourRepository extends FeatureRepository<Colour>{
        @Query("CREATE(feat:Colour:Feature {marketingDesc:{marketing}, engineeringDesc:{engineering}, code:{code}})")
        Colour createColour(@Param("marketing") String marketingDesc, @Param("engineering") String engineeringDesc, @Param("code") String code);

        @Query("MATCH (c:Colour {code:{colourCode}}) MATCH (c)-[:AVAILABLE_IN]->(market) RETURN c AS colour, COLLECT(market) AS markets")
        Colour getColourByCode(@Param("colourCode") String colourCode);

        Colour findByCode(@Param("code") String code);
    }

Элемент функции:

    @NodeEntity(label = "Feature")
    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public class Feature {
        @Id
        @GeneratedValue
        private Long id;
        private String marketingDesc;
        private String engineeringDesc;
        @Index(unique = true)
        private String code;

        @Relationship(type = "HAS_OPTION", direction = Relationship.INCOMING)
        private List<Option> options = new ArrayList<>();

        @Relationship(type = "AVAILABLE_IN")
        private List<Market> markets = new ArrayList<>();

        @Relationship(type = "HAS_PREREQUISITE", direction = Relationship.UNDIRECTED)
        private List<Prerequisite> prerequisites = new ArrayList<>();
    }

Элемент цвета:

    @AllArgsConstructor
    @NodeEntity(label = "Colour")
    public class Colour extends Feature {
    }

Объект рынка:

    @NodeEntity(label = "Market")
    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public class Market {
        @Id
        @GeneratedValue
        private Long id;

        @Index(unique = true)
        private String code;
        private String market;

        @Relationship(type = "AVAILABLE_IN", direction = Relationship.INCOMING)
        private List<Option> features = new ArrayList<>();
    }

Объект отношений (для функций, которые можно подключить к рынкам, на которых их можно купить):

    @RelationshipEntity(type = "AVAILABLE_IN")
    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public class Available {
        @Id
        @GeneratedValue
        private Long Id;
        private List<String> availableIn = new ArrayList<>();

        @StartNode
        private Feature feature;
        @EndNode
        private Market market;
    }

Контроллер:

    @RestController
    public class ConfigController {

        private final Handler configHandler;

        public ConfigController(Handler configHandler) {
            this.configHandler = configHandler;
        }

     @PostMapping(path = "/create/colour", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
        public SimpleResponse createColour(@RequestBody Colour request) {
            ColourService service = new ColourService(configHandler);
            Colour created = service.createColour(request);
            return SimpleResponse.builder().result("Created:", created).build();
        }

        @PostMapping(path = "/create/market", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
        public SimpleResponse createMarket(@RequestBody Market request) {
            MarketService service = new MarketService(configHandler);
            Market created = service.createMarket(request);
            return SimpleResponse.builder().result("Created", created).build();
        }

        @PostMapping(path = "/create/relationship/availableIn", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
        public SimpleResponse createAvailableInRelationship(@RequestBody OptionAvailInRequest request){
            RelationshipService service = new RelationshipService(configHandler);
            Object result = service.createAvailableInRelationship(request);
            return SimpleResponse.builder().result("Result:", result).build();
        }

        @GetMapping(path = "/colour/{code}")
        public SimpleResponse getColourByCode(@PathVariable(value = "code") String code) {
            ColourService service = new ColourService(configHandler);
            Colour colour = service.getColourByCode(code);
            return SimpleResponse.builder().result("Colour:", colour).build();
        }

        @GetMapping(path = "/features/available/{mrktCode}")
        public SimpleResponse getFeaturesInMarket(@PathVariable(value = "mrktCode") String mrktCode){
            RelationshipService service = new RelationshipService(configHandler);
            Collection<Feature> features = service.getFeaturesInMarket(mrktCode);
            return SimpleResponse.builder().result("Features:", features).build();
        }
    }

Файл Neo4jConfig:

    @Configuration
    @EnableNeo4jRepositories(basePackages = "package.location")
    @EnableTransactionManagement
    public class Neo4jConfig {
        @Bean
        public org.neo4j.ogm.config.Configuration configuration() {
            org.neo4j.ogm.config.Configuration configuration =
                    new org.neo4j.ogm.config.Configuration.Builder().build();


            return configuration;
        }

        @Bean
        public SessionFactory sessionFactory(org.neo4j.ogm.config.Configuration configuration) {

            return new SessionFactory(configuration,"package.location");
        }

        @Bean
        public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory) {
            return new Neo4jTransactionManager(sessionFactory);
        }
    }

Так, например, здесь я могу создать Colour Node:

Пример значения:

{
  "code": "string",
  "engineeringDesc": "string",
  "id": 0,
  "marketingDesc": "string",
  "markets": [
    {
      "code": "string",
      "features": [
        {}
      ],
      "id": 0,
      "market": "string"
    }
  ],
  "options": [
    {}
  ],
  "prerequisites": [
    {}
  ]
}

Что я отправляю:

{
  "code": "BLU",
  "engineeringDesc": "Blue engineering",
  "marketingDesc": "Blue marketing"
}

И это успешно создает узел цвета:

{
  "result": {
    "Created:": {
      "id": 0,
      "marketingDesc": "Blue marketing",
      "engineeringDesc": "Blue engineering",
      "code": "BLU",
      "options": [],
      "markets": [],
      "prerequisites": []
    }
  },
  "error": null
}

Я могу создать узел рынка: пример значения:

{
  "code": "string",
  "features": [
    {}
  ],
  "id": 0,
  "market": "string"
}

Что я отправляю:

{
  "code": "UB",
  "market": "England"
}

, который успешно создает узел рынка:

{
  "result": {
    "Created": {
      "id": 1,
      "code": "UB",
      "market": "England",
      "features": []
    }
  },
  "error": null
}

Iзатем можно создать отношения между ними, чтобы сказать, что цвет доступен на этом рынке:

{
  "featureCode": "BLU",
  "marketCode": "UB"
}

То, что я могу проверить, было создано, нажав: localhost: 8080 / features / available / UB

{
  "result": {
    "Features:": [
      {
        "id": 0,
        "marketingDesc": "Blue marketing",
        "engineeringDesc": "Blue engineering",
        "code": "BLU",
        "options": [],
        "markets": [],
        "prerequisites": []
      }
    ]
  },
  "error": null
}

Однако, когда я затем возвращаю сам Color Color Node: localhost: 8080 / color / BLU

{
  "result": {
    "Colour:": {
      "id": 0,
      "marketingDesc": "Blue marketing",
      "engineeringDesc": "Blue engineering",
      "code": "BLU",
      "options": [],
      "markets": [],
      "prerequisites": []
    }
  },
  "error": null
}

Опция 'markets' всегда пуста.Я пробовал настраиваемые запросы и создавал запросы с помощью помощника neo4j (например, findByCode и т. Д.), И каждый пример, который я могу найти, будет успешно возвращать связанные узлы, но, похоже, я не смогу получить мой.

Может кто-нибудь помочь?PS Пожалуйста, дайте мне знать, есть ли что-нибудь еще, что вам было бы полезно увидеть.Пытался отсортировать это в течение нескольких дней ....

1 Ответ

0 голосов
/ 05 июля 2019

Получил ответ на этот вопрос ...

Элемент функции должен был быть:

    @Relationship(type = "AVAILABLE_IN")
    @ApiModelProperty(hidden = true)
    private Set<Available> markets = new HashSet<>();

Объект рынка должен был быть:

    @Relationship(type = "AVAILABLE_IN", direction = Relationship.INCOMING)
    @ApiModelProperty(hidden = true)
    private Set<Available> features = new HashSet<>();

Что получаетраздел рынков компонента JSON больше не равен нулю ...

Теперь у меня проблема в том, что существует бесконечный цикл рекурсии между двумя классами, где функция отображает рынки, а рынки отображают функции

РЕДАКТИРОВАТЬ:

Для всех, кто сталкивался с подобными / подобными проблемами, я нашел действительно хороший ресурс github. Прохождение GitHub neo4j ogm

Очень помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...