Я настраиваю 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 Пожалуйста, дайте мне знать, есть ли что-нибудь еще, что вам было бы полезно увидеть.Пытался отсортировать это в течение нескольких дней ....