1 package de.dlr.shepard.context.semantic.daos;
2
3 import static de.dlr.shepard.common.util.CypherDslHelper.internalIdIs;
4 import static de.dlr.shepard.common.util.CypherDslHelper.notDeleted;
5
6 import de.dlr.shepard.common.neo4j.daos.GenericDAO;
7 import de.dlr.shepard.common.neo4j.entities.Annotatable;
8 import de.dlr.shepard.common.util.Constants;
9 import de.dlr.shepard.common.util.CypherQueryHelper;
10 import de.dlr.shepard.common.util.CypherQueryHelper.Neighborhood;
11 import de.dlr.shepard.context.semantic.entities.SemanticAnnotation;
12 import jakarta.enterprise.context.RequestScoped;
13 import jakarta.ws.rs.InternalServerErrorException;
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Optional;
18 import java.util.stream.StreamSupport;
19 import org.neo4j.cypherdsl.core.Cypher;
20
21 @RequestScoped
22 public class SemanticAnnotationDAO extends GenericDAO<SemanticAnnotation> {
23
24 public List<SemanticAnnotation> findAllSemanticAnnotationsByNeo4jId(long entityId) {
25 String query;
26 query = "MATCH (e)-[ha:has_annotation]->(a:SemanticAnnotation) WHERE ID(e)=%d WITH a %s".formatted(
27 entityId,
28 CypherQueryHelper.getReturnPart("a", Neighborhood.OUTGOING)
29 );
30 var queryResult = findByQuery(query, Collections.emptyMap());
31 return StreamSupport.stream(queryResult.spliterator(), false).toList();
32 }
33
34 public List<SemanticAnnotation> findAllSemanticAnnotationsByShepardId(long shepardId) {
35 String query;
36 query = String.format(
37 "MATCH (e)-[ha:has_annotation]->(a:SemanticAnnotation) WHERE e." + Constants.SHEPARD_ID + "=%d WITH a %s",
38 shepardId,
39 CypherQueryHelper.getReturnPart("a", Neighborhood.OUTGOING)
40 );
41 var queryResult = findByQuery(query, Collections.emptyMap());
42 return StreamSupport.stream(queryResult.spliterator(), false).toList();
43 }
44
45 public Optional<Annotatable> findAnnotatableByNeo4jIdNotDeleted(long entityId) {
46 var node = Cypher.anyNode().named("n");
47 var relatedTo = Cypher.anyNode();
48 var rels = node.relationshipTo(relatedTo);
49 var query = Cypher.match(node.where(notDeleted(node).and(internalIdIs(node, entityId))), rels, relatedTo)
50 .returning(node, rels, relatedTo)
51 .build()
52 .getCypher();
53 var result = session.query(query, Map.of());
54 var optionalResult = StreamSupport.stream(result.spliterator(), false).findFirst();
55 try {
56 return optionalResult.map(resultMap -> (Annotatable) resultMap.get("n"));
57 } catch (ClassCastException e) {
58 throw new InternalServerErrorException("Requested entity does not implement Annotatable interface!");
59 }
60 }
61
62 public void saveAnnotatable(Annotatable annotatable) {
63 session.save(annotatable);
64 }
65
66 @Override
67 public Class<SemanticAnnotation> getEntityType() {
68 return SemanticAnnotation.class;
69 }
70 }