Skip to content

StackOverflowError more than 20+ node with custom query #2583

Closed
@liseri

Description

@liseri

Issue

  1. It is normal when use Neo4jRepository findAll(pageable)
  2. It is normal when use custom query findAllWithOutgoingEdge(descripted below), less than 20 query nodes data.
  3. It is error query more than 20+ nodes data when use custom query findAllWithOutgoingEdge(descripted below)

Error

when use custom query(descipted below), and query more than 20+ nodes data,

java.lang.StackOverflowError: null
	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:673) ~[na:na]
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:489) ~[na:na]
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
	at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.getPropertyAccessor(ClassGeneratingPropertyAccessorFactory.java:104) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.mapping.model.InstantiationAwarePropertyAccessorFactory.lambda$getPropertyAccessor$0(InstantiationAwarePropertyAccessorFactory.java:46) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.mapping.model.InstantiationAwarePropertyAccessor.getProperty(InstantiationAwarePropertyAccessor.java:157) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$populateFrom$6(DefaultNeo4jEntityConverter.java:519) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.lambda$doWithAssociations$0(AssociationHandlerSupport.java:51) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:395) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.doWithAssociations(AssociationHandlerSupport.java:49) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.populateProperties(DefaultNeo4jEntityConverter.java:355) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:316) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.createInstanceOfRelationships(DefaultNeo4jEntityConverter.java:618) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$populateFrom$6(DefaultNeo4jEntityConverter.java:541) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.lambda$doWithAssociations$0(AssociationHandlerSupport.java:51) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:395) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.doWithAssociations(AssociationHandlerSupport.java:49) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.populateProperties(DefaultNeo4jEntityConverter.java:355) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:316) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.createInstanceOfRelationships(DefaultNeo4jEntityConverter.java:618) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$populateFrom$6(DefaultNeo4jEntityConverter.java:541) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.lambda$doWithAssociations$0(AssociationHandlerSupport.java:51) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:395) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.doWithAssociations(AssociationHandlerSupport.java:49) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.populateProperties(DefaultNeo4jEntityConverter.java:355) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:316) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.createInstanceOfRelationships(DefaultNeo4jEntityConverter.java:618) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$populateFrom$6(DefaultNeo4jEntityConverter.java:541) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.lambda$doWithAssociations$0(AssociationHandlerSupport.java:51) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:395) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.doWithAssociations(AssociationHandlerSupport.java:49) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.populateProperties(DefaultNeo4jEntityConverter.java:355) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:316) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.createInstanceOfRelationships(DefaultNeo4jEntityConverter.java:618) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$populateFrom$6(DefaultNeo4jEntityConverter.java:541) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.lambda$doWithAssociations$0(AssociationHandlerSupport.java:51) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:395) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.doWithAssociations(AssociationHandlerSupport.java:49) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.populateProperties(DefaultNeo4jEntityConverter.java:355) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:316) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.createInstanceOfRelationships(DefaultNeo4jEntityConverter.java:618) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$populateFrom$6(DefaultNeo4jEntityConverter.java:541) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.lambda$doWithAssociations$0(AssociationHandlerSupport.java:51) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:395) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.doWithAssociations(AssociationHandlerSupport.java:49) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.populateProperties(DefaultNeo4jEntityConverter.java:355) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.map(DefaultNeo4jEntityConverter.java:316) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.createInstanceOfRelationships(DefaultNeo4jEntityConverter.java:618) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.DefaultNeo4jEntityConverter.lambda$populateFrom$6(DefaultNeo4jEntityConverter.java:541) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.lambda$doWithAssociations$0(AssociationHandlerSupport.java:51) ~[spring-data-neo4j-6.3.2.jar:6.3.2]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:395) ~[spring-data-commons-2.7.2.jar:2.7.2]
	at org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport.doWithAssociations(AssociationHandlerSupport.java:49) ~[spring-data-neo4j-6.3.2.jar:6.3.2]

    ...
    ...


Env config

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

Entity Code

Node Class TxjmNodeEntity

@Node("hktxjm")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class TxjmNodeEntity {
    @Id
    @EqualsAndHashCode.Include
    Long id;
    @GeneratedValue(UUIDStringGenerator.class)
    @EqualsAndHashCode.Include
    @Property
    String uid;
    @Property
    private String name;
    @Property
    private String shape;
    @Property
    private String subShape;
    @Property
    private String subShapeName;

//    @DynamicLabels
//    public Set<String> moreLabels;

    @CompositeProperty
    private Map<String, String> props = new HashMap<>();

    @JsonManagedReference
    @Relationship(type = "guanXi", direction = Relationship.Direction.INCOMING)
    private List<TxjmEdgeEntity> edgeIncoming;

    @JsonManagedReference
    @Relationship(type = "guanXi", direction = Relationship.Direction.OUTGOING)
    private List<TxjmEdgeEntity> edgeOutgoing;

    ...

}

RelationshipProperties Class TxjmEdgeEntity

@RelationshipProperties
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class TxjmEdgeEntity {

    @RelationshipId
    @EqualsAndHashCode.Include
    private Long id;
    @GeneratedValue(UUIDStringGenerator.class)
    @Property
    private String uid;
    @Property
    private String name;
    @Property
    private String shape;
    @Property
    private String subShape;
    @Property
    private String subShapeName;

    @CompositeProperty
    private Map<String, String> props = new HashMap<>();

    @JsonBackReference
    @TargetNode
    private TxjmNodeEntity targetNode;

    ...

}

Neo4jRepository Class TxjmNodeEntityRepository

@Repository
public interface TxjmNodeEntityRepository extends Neo4jRepository<TxjmNodeEntity, Long> {

    // **It is normal**
    // **Neo4jRepository query**
    Page<TxjmNodeEntity> findAll(Pageable pageable);

    // **It is error, when query more than 20+ nodes data**
    // **custom query**
    @Query(value = """
        MATCH (s:hktxjm)
        WITH s OPTIONAL MATCH (s)-[r:guanXi]->(t:hktxjm)
        RETURN s, collect(r), collect(t)
        :#{orderBy(#pageable)} SKIP $skip LIMIT $limit
        """,
        countQuery = "MATCH (s:hktxjm) RETURN count(s)")
//    @Query(value = """
//            MATCH p=(s:hktxjm)-[r:guanXi]->(t:hktxjm)
//            RETURN s, relationships(p), nodes(p)
//            :#{orderBy(#pageable)} SKIP $skip LIMIT $limit
//            """,
//            countQuery = "MATCH (s:hktxjm) RETURN count(s)")
    Page<TxjmNodeEntity> findAllWithOutgoingEdge(Pageable pageable);
}

Metadata

Metadata

Assignees

Labels

status: needs-investigationAn issue that has been triaged but needs further investigationtype: bugA general bug

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions