Пользовательский запрос SDN / RX @Глубина сопоставления свойств отношений

#spring-boot #neo4j #spring-data-neo4j

#пружинный ботинок #neo4j #spring-data-neo4j

Вопрос:

Я натыкаюсь на проблему с SDN / RX 1.1

         <dependency>
            <groupId>org.neo4j.springframework.data</groupId>
            <artifactId>spring-data-neo4j-rx-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
 

При использовании пользовательского запроса к классу репозитория и попытке запросить несколько отношений со свойствами.

У меня есть два свойства отношений :

 @RelationshipProperties
public class InRegionProperties {

  @Id
  @GeneratedValue
  private Long id;
  private String location;
  private int distance;

  public InRegionProperties (String location, int distance) {
    this.id=null;
    this.location = location;
    this.distance = distance;
  }

  public Long getId () {
    return id;
  }

  public String getLocation () {
    return location;
  }

  public int getDistance () {
    return distance;
  }

  public void setLocation (String location) {
    this.location = location;
  }

  public void setDistance (int distance) {
    this.distance = distance;
  }

  public void setId (Long id) {
    this.id = id;
  }
}
 

и

 @RelationshipProperties
public class InWorldProperties {

  @Id
  @GeneratedValue
  private Long id;
  private String location;

  public InWorldProperties (String location) {
    this.id=null;
    this.location = location;
  }

  public Long getId () {
    return id;
  }

  public String getLocationInWorld () {
    return location;
  }

  public void setLocationInWorld (String location) {
    this.location = location;
  }

  public void setId (Long id) {
    this.id = id;
  }
}
 

Для двух узлов, узла региона и мирового узла. У меня есть последний узел, заменяющий узел, все они связаны таким образом :

(l:Lieu) -[:IN_REGION{местоположение, расстояние}]->(r: Регион) -[:IN_WORLD{местоположение}]->(w: Мир)

Затем я использую пользовательский запрос в WorldRepository для извлечения регионов в мире, а затем извлекаю их в регионе.

 @Query("MATCH (r:`Region`)-[:IN_WORLD]->(n:`World`) WHERE id(r)=$regionId WITH n, id(n) AS __internalNeo4jId__ "
        "RETURN n{.description, __internalNeo4jId__: id(n), .name, __nodeLabels__: labels(n), "
        "World_IN_WORLD_Region:[(n)<-[__relationship__:IN_WORLD]-(n_regions:Region) | n_regions{.description, __internalNeo4jId__: id(n_regions), .name, __nodeLabels__: labels(n_regions), "
        "Region_IN_REGION_Lieu: [(n_regions)<-[__relationship__:`IN_REGION`]-(n_regions_lieux:Lieu) | n_regions_lieux{.description, __internalNeo4jId__: id(n_regions_lieux), .name, __nodeLabels__: labels(n_regions_lieux), __relationship__}], __relationship__}]"
        "}")
  Mono<World> getByRegion(Long regionId);
 

Вот где возникает проблема :

Похоже, что механизм сопоставления SDN / RX принимает только отношение в качестве псевдонима для отношения. Результатом этого запроса в Cypher (браузер Neo4j) является :

 {
  "name": "New Finn City",
  "description": "Ville Monde, terre de la Ligue Des Héros.",
  "__internalNeo4jId__": 61,
  "World_IN_WORLD_Region": [
    {
      "__internalNeo4jId__": 14,
      "__relationship__": {
"identity": 4,
"start": 14,
"end": 61,
"type": "IN_WORLD",
"properties": {
"location": "Sud Est"
        }
      },
      "name": "Bio Town",
      "description": "Le quartier réserve naturelle. La biosphère, en constante évolution grâce au Weillenium, y est préservée et vit en liberté protégée et surveillée.",
      "Region_IN_REGION_Lieu": [],
      "__nodeLabels__": [
        "Region"
      ]
    },
    {
      "__internalNeo4jId__": 15,
      "__relationship__": {
"identity": 3,
"start": 15,
"end": 61,
"type": "IN_WORLD",
"properties": {
"location": "Nord"
        }
      },
      "name": "Astro Town",
      "description": null,
      "Region_IN_REGION_Lieu": [],
      "__nodeLabels__": [
        "Region"
      ]
    },
    {
      "__internalNeo4jId__": 13,
      "__relationship__": {
"identity": 2,
"start": 13,
"end": 61,
"type": "IN_WORLD",
"properties": {
"location": "Est"
        }
      },
      "name": "Electro Town",
      "description": "Le quartier des savants et inventeurs, où les robots et machines alimentées en Weillenium sont omniprésentes.",
      "Region_IN_REGION_Lieu": [],
      "__nodeLabels__": [
        "Region"
      ]
    },
    {
      "__internalNeo4jId__": 12,
      "__relationship__": {
"identity": 1,
"start": 12,
"end": 61,
"type": "IN_WORLD",
"properties": {
"location": "Nord Ouest"
        }
      },
      "name": "Dark Town",
      "description": "Le quartier pauvre, rongé par la criminalité, et le traffic de Weillenium. C'est le territoire de la Ligue des Villains.",
      "Region_IN_REGION_Lieu": [],
      "__nodeLabels__": [
        "Region"
      ]
    },
    {
      "__internalNeo4jId__": 11,
      "__relationship__": {
"identity": 0,
"start": 11,
"end": 61,
"type": "IN_WORLD",
"properties": {
"location": "Sud Ouest"
        }
      },
      "name": "Atom Town",
      "description": "Le quartier central de New Finn City, où siège la Ligue des Héros. C'est le centre administratif du monde.",
      "Region_IN_REGION_Lieu": [],
      "__nodeLabels__": [
        "Region"
      ]
    }
  ],
  "__nodeLabels__": [
    "World"
  ]
}
 

Узлы Lieux не извлекаются из-за повторного использования relationship в качестве псевдонима. При использовании другого псевдонима в cypher для отношения :IN_REGION я получаю выбранное значение, но в SDN / RX я получаю следующую ошибку :

 Caused by: org.neo4j.driver.exceptions.value.Uncoercible: Cannot coerce NULL to Relationship
    at org.neo4j.driver.internal.value.ValueAdapter.asRelationship(ValueAdapter.java:311)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.createInstanceOfRelationships(DefaultNeo4jConverter.java:499)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.lambda$populateFrom$6(DefaultNeo4jConverter.java:375)
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:380)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.map(DefaultNeo4jConverter.java:288)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.lambda$createInstanceOfRelationships$22(DefaultNeo4jConverter.java:496)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter$KnownObjects.computeIfAbsent(DefaultNeo4jConverter.java:566)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.createInstanceOfRelationships(DefaultNeo4jConverter.java:495)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.lambda$populateFrom$6(DefaultNeo4jConverter.java:375)
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:380)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.map(DefaultNeo4jConverter.java:288)
    at org.neo4j.springframework.data.core.mapping.DefaultNeo4jConverter.read(DefaultNeo4jConverter.java:138)
    ... 48 more
 

Разработка сопоставления, по-видимому, принимает отношение только в качестве псевдонима для отношения, свойства которого должны быть сопоставлены в классе @relationshippproperties.

Есть ли способ обойти эту проблему?

Спасибо вам всем за вашу помощь.

Ответ №1:

Перво-наперво: теперь существует официальный SDN 6, который является преемником SDN / RX. Мы прекратили разработку SDN / RX полгода назад и сосредоточились на новом SDN. SDN 6 можно использовать с пружинным загрузчиком, начиная с версии 2.4.

Отношение, называющее big, — это то, что мы, например, исправили в последние месяцы.

Если у вас действительно нет возможности обновиться, я мог бы взглянуть. Пожалуйста, добавьте комментарий, если это необходимо.

Комментарии:

1. Привет, большое вам спасибо и извините за поздний ответ. Мне удалось обойти эту проблему, и я, вероятно, достаточно скоро перейду на SDN6. Спасибо вам за ваш ответ!

2. Пожалуйста, не говорите мне, что этот пакет устарел: github.com/neo4j/sdn-rx . Если это так, к сожалению, но если вы работаете над чем-то другим, что не имеет обратной совместимости, я не буду его использовать. Потому что потом, через полгода, ты передумываешь и снова начинаешь что-то делать по-другому.