Skip to content

SimpleNeo4jRepository::existsById loads all relations of the node #2417

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Andy2003 opened this issue Nov 1, 2021 · 1 comment
Closed

SimpleNeo4jRepository::existsById loads all relations of the node #2417

Andy2003 opened this issue Nov 1, 2021 · 1 comment
Assignees
Labels
type: enhancement A general enhancement

Comments

@Andy2003
Copy link
Contributor

Andy2003 commented Nov 1, 2021

Given

@Node
@Data
@Setter(AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@SuperBuilder(toBuilder = true)
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class NodeEntity {
	@Id
	@EqualsAndHashCode.Include
	private String nodeId;

	@Relationship(type = "CHILD_OF", direction = Relationship.Direction.INCOMING)
	private Set<NodeEntity> children;

	@Relationship(type = "CHILD_OF", direction = Relationship.Direction.OUTGOING)
	private NodeEntity parent;

}
interface NodeRepository extends Neo4jRepository<NodeEntity, String> {
}
CREATE (n1:NodeEntity{nodeId: 'n1'}) 
CREATE (n2:NodeEntity{nodeId: 'n2'})
CREATE (n3:NodeEntity{nodeId: 'n3'})
CREATE (n4:NodeEntity{nodeId: 'n4'})
CREATE (n4)-[:CHILD_OF]->(n2)
CREATE (n3)-[:CHILD_OF]->(n2)
CREATE (n2)-[:CHILD_OF]->(n1)

The following test will load all NodeEntities in memory:

@Test
void existsByIdCycle(@Autowired NodeRepository repository) {
	boolean exists = repository.existsById("n2");
	assertThat(exists).isTrue();
}

Log:

[main] 2021-11-01 13:45:01,225 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE nodeEntity.nodeId = $__id__ WITH collect(id(nodeEntity)) AS __sn__ RETURN __sn__
[main] 2021-11-01 13:45:01,225 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__id__: "n2"}
[main] 2021-11-01 13:45:01,325 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE nodeEntity.nodeId = $__id__ OPTIONAL MATCH (nodeEntity)<-[__sr__:`CHILD_OF`]-(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,325 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__id__: "n2"}
[main] 2021-11-01 13:45:01,466 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE id(nodeEntity) IN $__ids__ OPTIONAL MATCH (nodeEntity)<-[__sr__:`CHILD_OF`]-(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,466 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__ids__: [24, 25]}
[main] 2021-11-01 13:45:01,521 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE id(nodeEntity) IN $__ids__ OPTIONAL MATCH (nodeEntity)-[__sr__:`CHILD_OF`]->(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,522 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__ids__: [24, 25]}
[main] 2021-11-01 13:45:01,563 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE id(nodeEntity) IN $__ids__ OPTIONAL MATCH (nodeEntity)<-[__sr__:`CHILD_OF`]-(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,564 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__ids__: [23]}
[main] 2021-11-01 13:45:01,568 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE id(nodeEntity) IN $__ids__ OPTIONAL MATCH (nodeEntity)-[__sr__:`CHILD_OF`]->(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,568 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__ids__: [23]}
[main] 2021-11-01 13:45:01,571 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE id(nodeEntity) IN $__ids__ OPTIONAL MATCH (nodeEntity)<-[__sr__:`CHILD_OF`]-(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,571 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__ids__: [22]}
[main] 2021-11-01 13:45:01,574 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE id(nodeEntity) IN $__ids__ OPTIONAL MATCH (nodeEntity)-[__sr__:`CHILD_OF`]->(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,574 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__ids__: [22]}
[main] 2021-11-01 13:45:01,578 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (nodeEntity:`NodeEntity`) WHERE nodeEntity.nodeId = $__id__ OPTIONAL MATCH (nodeEntity)-[__sr__:`CHILD_OF`]->(__srn__:`NodeEntity`) WITH collect(id(nodeEntity)) AS __sn__, collect(id(__srn__)) AS __srn__, collect(id(__sr__)) AS __sr__ RETURN __sn__, __srn__, __sr__
[main] 2021-11-01 13:45:01,578 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {__id__: "n2"}
[main] 2021-11-01 13:45:01,631 DEBUG    org.springframework.data.neo4j.cypher: 313 - Executing:
MATCH (rootNodeIds) WHERE id(rootNodeIds) IN $rootNodeIds WITH collect(rootNodeIds) AS n OPTIONAL MATCH ()-[relationshipIds]-() WHERE id(relationshipIds) IN $relationshipIds WITH n, collect(DISTINCT relationshipIds) AS __sr__ OPTIONAL MATCH (relatedNodeIds) WHERE id(relatedNodeIds) IN $relatedNodeIds WITH n, __sr__ AS __sr__, collect(DISTINCT relatedNodeIds) AS __srn__ UNWIND n AS rootNodeIds WITH rootNodeIds AS nodeEntity, __sr__, __srn__ RETURN nodeEntity AS __sn__, __sr__, __srn__
[main] 2021-11-01 13:45:01,631 TRACE    org.springframework.data.neo4j.cypher: 334 - with parameters:
:params {rootNodeIds: [23], relatedNodeIds: [22, 23, 24, 25], relationshipIds: [0, 1, 2]}
[main] 2021-11-01 13:45:01,763  INFO                                   Driver:  48 - Closing driver instance 917190676
@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Nov 1, 2021
@meistermeier meistermeier self-assigned this Nov 2, 2021
@meistermeier meistermeier added type: enhancement A general enhancement and removed status: waiting-for-triage An issue we've not yet triaged labels Nov 9, 2021
@meistermeier
Copy link
Collaborator

Thanks for reporting this. This is indeed something we can improve.
We took the simplest approach first and just checked if the whole result (incl. relationships) returns at least one entity.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: enhancement A general enhancement
Projects
None yet
Development

No branches or pull requests

3 participants