Migration to RX

I started the process of switching over to spring data neo4j rx. Right away, I noticed quite a few hurdles that we will need to overcome.

For starters, the missing support of @RelationshipEntity, @StartNode, @EndNode, @Index, @DateLong

We use RelationshipEntity a lot in our project, We have many relationship classes with @StartNode and @EndNode, and it is important to us to know which way the relationship -> points

Are there any suggestions as to how we can migrate. Here's an example of what I'm referring to:

@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(exclude = {"startRoute", "endRoute"}, callSuper = false)
@ToString(exclude = {"startRoute", "endRoute"})
//@CompositeIndex(value = {"Route_ID", "Capture_Id"}, unique = true)

@RelationshipEntity(type = "CARRIED_BY")
public class CarriedBy {
    @Id @GeneratedValue
    private Long graphId;

    @Index
    @Property(name = "Route_ID")
    private String id;

    @Property(name = "Route_IsAEnd")
    private boolean aEndRouteId;

    @Property(name = "Date_NetworkExtract")
    @DateLong
    private Date networkExtract;

    @Index
    @Property(name = "Capture_Id")
    private Long captureId;

    @StartNode
    private RouteEntity startRoute;

    @EndNode
    private RouteEntity endRoute;
}

Thanks.

With the SDN 6.0 RC1 that has been released last Wednesday, there is a new API for mapping relationships with properties.

@RelationshipProperties
public class CarriedBy {

  @Property("Route_ID")
  private String id

// other properties

  @TargetNode
   private RouteEntity endRoute;
}

and in your RouteEntity something like:

@Relationship("CARRIED_BY")
private List<CarriedBy> carriedByRouteEntities;

will make SDN use those relationship properties classes.

For the raw conversion, you would need to define your own converter as described here: Spring Data Neo4j⚡️RX

Note: We are currently updating the documentation and examples for the new relationship properties and moving all to the official Spring Data reference docs.

Thank you Gerrit.

Another snag in the migration we run into is this. We use converters for embedded objects as shown below:

    @Convert(RouteStateConverter.class)
    private RouteState routeState; 

And we wrote our own converters to go to/from the graph:

public class RouteStateConverter implements CompositeAttributeConverter<RouteState> {

    @Override
    public Map<String, ?> toGraphProperties(RouteState routeState) {
        // conversion code
    }

    @Override
    public RouteState toEntityAttribute(Map<String, ?> map) {
       // conversion code
    }

I hope that somebody already reached out to you on a different channel but for having a documented answer here: Add support for OGM's CompositeAttributeConverter. [DATAGRAPH-1393] · Issue #1954 · spring-projects/spring-data-neo4j · GitHub
We are working on this.

1 Like

Gerrit do you know when is going to be release?

It has already been released with SDN 6.0.0. To get some impression how it works and should be used I suggest to look into this test class spring-data-neo4j/ImperativeCompositePropertiesIT.java at main · spring-projects/spring-data-neo4j · GitHub