View Javadoc
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  }