source: AnnotationManagerN4J/src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java @ 28:f4ed2ed33e5b

Last change on this file since 28:f4ed2ed33e5b was 28:f4ed2ed33e5b, checked in by dwinter, 12 years ago

Restinterface zur Anzeige von Tags hinzugefuegt-

File size: 27.8 KB
Line 
1/**
2 *
3 */
4package de.mpiwg.itgroup.annotations.neo4j;
5
6import java.util.ArrayList;
7import java.util.Calendar;
8import java.util.HashSet;
9import java.util.List;
10import java.util.Set;
11
12import org.apache.log4j.Logger;
13import org.neo4j.graphdb.Direction;
14import org.neo4j.graphdb.GraphDatabaseService;
15import org.neo4j.graphdb.Node;
16import org.neo4j.graphdb.Relationship;
17import org.neo4j.graphdb.RelationshipType;
18import org.neo4j.graphdb.Transaction;
19import org.neo4j.graphdb.index.Index;
20import org.neo4j.graphdb.index.IndexHits;
21
22import de.mpiwg.itgroup.annotations.Actor;
23import de.mpiwg.itgroup.annotations.Annotation;
24import de.mpiwg.itgroup.annotations.Annotation.FragmentTypes;
25import de.mpiwg.itgroup.annotations.Group;
26import de.mpiwg.itgroup.annotations.Person;
27import de.mpiwg.itgroup.annotations.Tag;
28
29/**
30 * @author casties
31 *
32 */
33public class AnnotationStore {
34
35    protected static Logger logger = Logger.getLogger(AnnotationStore.class);
36
37    protected GraphDatabaseService graphDb;
38
39    public static enum NodeTypes {
40        ANNOTATION, PERSON, TARGET, GROUP, TAG
41    }
42
43    protected List<Index<Node>> nodeIndexes;
44
45    public static enum RelationTypes implements RelationshipType {
46        ANNOTATES, CREATED, PERMITS_ADMIN, PERMITS_DELETE, PERMITS_UPDATE, PERMITS_READ, MEMBER_OF, HAS_TAG
47    }
48
49    public static String ANNOTATION_URI_BASE = "http://entities.mpiwg-berlin.mpg.de/annotations/";
50
51    public AnnotationStore(GraphDatabaseService graphDb) {
52        super();
53        this.graphDb = graphDb;
54        nodeIndexes = new ArrayList<Index<Node>>(5);
55        // List.set(enum.ordinal(), val) seems not to work.
56        nodeIndexes.add(NodeTypes.ANNOTATION.ordinal(), graphDb.index().forNodes("annotations"));
57        nodeIndexes.add(NodeTypes.PERSON.ordinal(), graphDb.index().forNodes("persons"));
58        nodeIndexes.add(NodeTypes.TARGET.ordinal(), graphDb.index().forNodes("targets"));
59        nodeIndexes.add(NodeTypes.GROUP.ordinal(), graphDb.index().forNodes("groups"));
60        nodeIndexes.add(NodeTypes.TAG.ordinal(), graphDb.index().forNodes("tags"));
61    }
62
63    protected Index<Node> getNodeIndex(NodeTypes type) {
64        return nodeIndexes.get(type.ordinal());
65    }
66
67    /**
68     * @param userUri
69     * @return
70     */
71    public Node getPersonNodeByUri(String userUri) {
72        if (userUri == null) return null;
73        Node person = getNodeIndex(NodeTypes.PERSON).get("uri", userUri).getSingle();
74        return person;
75    }
76
77    /**
78     * @param tagUri
79     * @return
80     */
81    public Node getTagNodeByUri(String tagUri) {
82        if (tagUri == null) return null;
83        Node person = getNodeIndex(NodeTypes.TAG).get("uri", tagUri).getSingle();
84        return person;
85    }
86
87    public List<Actor> getActors(String key, String query, NodeTypes type) {
88        ArrayList<Actor> actors = new ArrayList<Actor>();
89        Index<Node> idx = getNodeIndex(type);
90        if (key == null) {
91            key = "uri";
92            query = "*";
93        }
94        IndexHits<Node> actorNodes = idx.query(key, query);
95        for (Node actorNode : actorNodes) {
96            Actor actor = createActorFromNode(actorNode);
97            actors.add(actor);
98        }
99        return actors;
100    }
101
102    /**
103     * Returns List of Groups.
104     * Key has to be indexed.
105     *
106     * @param key
107     * @param query
108     * @return
109     */
110    public List<Group> getGroups(String key, String query) {
111        ArrayList<Group> groups = new ArrayList<Group>();
112        Index<Node> idx = getNodeIndex(NodeTypes.GROUP);
113        if (key == null) {
114            key = "uri";
115            query = "*";
116        }
117        IndexHits<Node> groupNodes = idx.query(key, query);
118        for (Node groupNode : groupNodes) {
119            Actor group = createActorFromNode(groupNode);
120            groups.add((Group) group);
121        }
122        return groups;
123    }
124   
125   
126    /**
127     * Returns List of Tags.
128     * Key has to be indexed.
129     *
130     * @param key
131     * @param query
132     * @return
133     */
134    public List<Tag> getTags(String key, String query) {
135        ArrayList<Tag> tags = new ArrayList<Tag>();
136        Index<Node> idx = getNodeIndex(NodeTypes.TAG);
137        if (key == null) {
138            key = "uri";
139            query = "*";
140        }
141        IndexHits<Node> groupNodes = idx.query(key, query);
142        for (Node groupNode : groupNodes) {
143            Tag tag = createTagFromNode(groupNode);
144            tags.add(tag);
145        }
146        return tags;
147    }
148
149 
150   /**
151     * Returns List of Groups the person is member of.
152     *
153     * @param person
154     * @return
155     */
156    public List<Group> getGroupsForPersonNode(Node person) {
157        ArrayList<Group> groups = new ArrayList<Group>();
158        Iterable<Relationship> rels = person.getRelationships(RelationTypes.MEMBER_OF);
159        for (Relationship rel : rels) {
160            Node groupNode = rel.getEndNode();
161            Actor group = createActorFromNode(groupNode);
162            // make sure we're getting a group
163            if (!(group instanceof Group)) {
164                logger.error("target of MEMBER_OF is not GROUP! rel=" + rel);
165                continue;
166            }
167            groups.add((Group) group);
168        }
169        return groups;
170    }
171
172    /**
173     * Returns if person with uri is in Group group.
174     *
175     * @param person
176     * @param group
177     * @return
178     */
179    public boolean isPersonInGroup(Person person, Group group) {
180        Node pn = getPersonNodeByUri(person.getUriString());
181        if (pn == null) return false;
182        // optimized version of getGroupsForPersonNode
183        Iterable<Relationship> rels = pn.getRelationships(RelationTypes.MEMBER_OF);
184        for (Relationship rel : rels) {
185            Node gn = rel.getEndNode();
186            if (gn.getProperty("uri", "").equals(group.getUriString()) || gn.getProperty("id", "").equals(group.getId())) {
187                return true;
188            }
189        }
190        return false;
191    }
192
193    /**
194     * Returns the members of the group.
195     *
196     * @param group
197     * @return
198     */
199    public List<Person> getMembersOfGroup(Group group) {
200        ArrayList<Person> members = new ArrayList<Person>();
201        Node gn = getActorNode(group);
202        Iterable<Relationship> rels = gn.getRelationships(RelationTypes.MEMBER_OF);
203        for (Relationship rel : rels) {
204            Node memberNode = rel.getStartNode();
205            Actor member = createActorFromNode(memberNode);
206            // make sure we're getting a group
207            if (!(member instanceof Person)) {
208                logger.error("source of MEMBER_OF is not PERSON! rel=" + rel);
209                continue;
210            }
211            members.add((Person) member);
212        }
213        return members;
214    }
215   
216    /**
217     * Returns the stored Actor matching the given one.
218     *
219     * @param actor
220     * @return
221     */
222    public Actor getActor(Actor actor) {
223        Node actorNode = getActorNode(actor);
224        Actor storedActor = createActorFromNode(actorNode);
225        return storedActor;
226    }
227   
228    /**
229     * Stores an Actor (Person or Group). Creates a new actor Node or returns an existing one.
230     *
231     * @param actor
232     * @return
233     */
234    public Actor storeActor(Actor actor) {
235        Node actorNode = getOrCreateActorNode(actor);
236        Actor storedActor = createActorFromNode(actorNode);
237        return storedActor;
238    }
239   
240    /**
241     * Returns the Annotation with the given id.
242     *
243     * @param id
244     * @return
245     */
246    public Annotation getAnnotationById(String id) {
247        Node annotNode = getNodeIndex(NodeTypes.ANNOTATION).get("id", id).getSingle();
248        Annotation annot = createAnnotationFromNode(annotNode);
249        return annot;
250    }
251
252    /**
253     * Returns an Annotation object from an annotation-Node.
254     *
255     * @param annotNode
256     * @return
257     */
258    public Annotation createAnnotationFromNode(Node annotNode) {
259        Annotation annot = new Annotation();
260        annot.setUri((String) annotNode.getProperty("id", null));
261        annot.setBodyText((String) annotNode.getProperty("bodyText", null));
262        annot.setBodyUri((String) annotNode.getProperty("bodyUri", null));
263        /*
264         * get annotation target from relation
265         */
266        Relationship targetRel = getRelation(annotNode, RelationTypes.ANNOTATES, null);
267        if (targetRel != null) {
268            Node target = targetRel.getEndNode();
269            annot.setTargetBaseUri((String) target.getProperty("uri", null));
270        } else {
271            logger.error("annotation " + annotNode + " has no target node!");
272        }
273        annot.setTargetFragment((String) annotNode.getProperty("targetFragment", null));
274        String ft = (String) annotNode.getProperty("fragmentType", null);
275        if (ft != null) {
276            annot.setFragmentType(FragmentTypes.valueOf(ft));
277        }
278        /*
279         * get creator from relation
280         */
281        Relationship creatorRel = getRelation(annotNode, RelationTypes.CREATED, null);
282        if (creatorRel != null) {
283            Node creatorNode = creatorRel.getStartNode();
284            Actor creator = createActorFromNode(creatorNode);
285            annot.setCreator(creator);
286        } else {
287            logger.error("annotation " + annotNode + " has no creator node!");
288        }
289        /*
290         * get creation date
291         */
292        annot.setCreated((String) annotNode.getProperty("created", null));
293        /*
294         * get permissions
295         */
296        Relationship adminRel = getRelation(annotNode, RelationTypes.PERMITS_ADMIN, null);
297        if (adminRel != null) {
298            Node adminNode = adminRel.getEndNode();
299            Actor admin = createActorFromNode(adminNode);
300            annot.setAdminPermission(admin);
301        }
302        Relationship deleteRel = getRelation(annotNode, RelationTypes.PERMITS_DELETE, null);
303        if (deleteRel != null) {
304            Node deleteNode = deleteRel.getEndNode();
305            Actor delete = createActorFromNode(deleteNode);
306            annot.setDeletePermission(delete);
307        }
308        Relationship updateRel = getRelation(annotNode, RelationTypes.PERMITS_UPDATE, null);
309        if (updateRel != null) {
310            Node updateNode = updateRel.getEndNode();
311            Actor update = createActorFromNode(updateNode);
312            annot.setUpdatePermission(update);
313        }
314        Relationship readRel = getRelation(annotNode, RelationTypes.PERMITS_READ, null);
315        if (readRel != null) {
316            Node readNode = readRel.getEndNode();
317            Actor read = createActorFromNode(readNode);
318            annot.setReadPermission(read);
319        }
320        /*
321         * get tags
322         */
323        Set<String> tags = new HashSet<String>();
324        for (Relationship rel : annotNode.getRelationships(RelationTypes.HAS_TAG)) {
325            String tag = (String) rel.getEndNode().getProperty("name", null);
326            if (tag != null) {
327                tags.add(tag);
328            }
329        }
330        annot.setTags(tags);
331
332        return annot;
333    }
334
335    /**
336     * Returns an Actor object from a node.
337     *
338     * @param actorNode
339     * @return
340     */
341    protected Actor createActorFromNode(Node actorNode) {
342        String id = (String) actorNode.getProperty("id", null);
343        String uri = (String) actorNode.getProperty("uri", null);
344        String name = (String) actorNode.getProperty("name", null);
345        String type = (String) actorNode.getProperty("TYPE", null);
346        if (type != null && type.equals("PERSON")) {
347            return new Person(id, uri, name);
348        } else if (type != null && type.equals("GROUP")) {
349            return new Group(id, uri, name);
350        }
351        return null;
352    }
353   
354    public Tag createTagFromNode(Node tagNode) {
355        String name = (String) tagNode.getProperty("name", null);
356        String uri = (String) tagNode.getProperty("uri", null);
357        String id = (String) tagNode.getProperty("id", null);
358       
359        return new Tag(id, uri, name);
360               
361        }
362
363
364    /**
365     * Store a new annotation in the store or update an existing one. Returns
366     * the stored annotation.
367     *
368     * @param annot
369     * @return
370     */
371    public Annotation storeAnnotation(Annotation annot) {
372        Node annotNode = null;
373        Transaction tx = graphDb.beginTx();
374        try {
375            /*
376             * create or get the annotation
377             */
378            String id = annot.getUri();
379            if (id == null) {
380                id = createRessourceURI("annot:");
381            }
382            annotNode = getOrCreateAnnotationNode(id);
383
384            /*
385             * the annotation body
386             */
387            String bodyText = annot.getBodyText();
388            if (bodyText != null) {
389                annotNode.setProperty("bodyText", bodyText);
390            }
391            String bodyUri = annot.getBodyUri();
392            if (bodyUri != null) {
393                annotNode.setProperty("bodyUri", bodyUri);
394            }
395
396            /*
397             * the annotation target
398             */
399            String targetBaseUri = annot.getTargetBaseUri();
400            if (targetBaseUri != null) {
401                Node target = getOrCreateTargetNode(targetBaseUri);
402                getOrCreateRelation(annotNode, RelationTypes.ANNOTATES, target);
403            }
404
405            /*
406             * The fragment part of the annotation target.
407             */
408            String targetFragment = annot.getTargetFragment();
409            FragmentTypes fragmentType = annot.getFragmentType();
410            if (targetFragment != null) {
411                annotNode.setProperty("targetFragment", targetFragment);
412                annotNode.setProperty("fragmentType", fragmentType.name());
413            }
414
415            /*
416             * The creator of this annotation.
417             */
418            Actor creator = annot.getCreator();
419            if (creator != null) {
420                Node creatorNode = getOrCreateActorNode(creator);
421                getOrCreateRelation(creatorNode, RelationTypes.CREATED, annotNode);
422            }
423
424            /*
425             * The creation date of this annotation.
426             */
427            String created = annot.getCreated();
428            if (created != null) {
429                annotNode.setProperty("created", created);
430            }
431
432            /*
433             * Permissions for this annotation.
434             */
435            setPermissionRelation(annotNode, RelationTypes.PERMITS_ADMIN, annot.getAdminPermission());
436            setPermissionRelation(annotNode, RelationTypes.PERMITS_DELETE, annot.getDeletePermission());
437            setPermissionRelation(annotNode, RelationTypes.PERMITS_UPDATE, annot.getUpdatePermission());
438            setPermissionRelation(annotNode, RelationTypes.PERMITS_READ, annot.getReadPermission());
439
440            /*
441             * Tags on this annotation.
442             */
443            Set<String> newTags = annot.getTags();
444            // we ignore existing tags if tags == null
445            if (newTags != null) {
446                List<Relationship> oldHasTags = new ArrayList<Relationship>();
447                for (Relationship rel : annotNode.getRelationships(RelationTypes.HAS_TAG)) {
448                    oldHasTags.add(rel);
449                }
450                // adjust to new tags
451                if (newTags.isEmpty()) {
452                    // remove old tags
453                    if (!oldHasTags.isEmpty()) {
454                        for (Relationship rel : oldHasTags) {
455                            rel.delete();
456                            // TODO: should we delete orphan nodes too?
457                        }
458                    }
459                } else {
460                    if (!oldHasTags.isEmpty()) {
461                        // adjust old tags
462                        for (Relationship rel : oldHasTags) {
463                            String oldTag = (String) rel.getEndNode().getProperty("name", null);
464                            if (newTags.contains(oldTag)) {
465                                // tag exists
466                                newTags.remove(oldTag);
467                            } else {
468                                // tag exists no longer
469                                rel.delete();
470                                // TODO: should we delete orphan nodes too?
471                            }
472                        }
473                    }
474                    if (!newTags.isEmpty()) {
475                        // still tags to add
476                        for (String tag : newTags) {
477                            // create new tag
478                            Node tagNode = getOrCreateTagNode(new Tag(null,null,tag));
479                            getOrCreateRelation(annotNode, RelationTypes.HAS_TAG, tagNode);
480                        }
481                    }
482
483                }
484            }
485            tx.success();
486        } finally {
487            tx.finish();
488        }
489
490        // re-read and return annotation
491        Annotation storedAnnot = createAnnotationFromNode(annotNode);
492        return storedAnnot;
493    }
494
495    /**
496     * Deletes the annotation with the given id.
497     *
498     * @param id
499     */
500    public void deleteById(String id) {
501        Node annotNode = getNodeIndex(NodeTypes.ANNOTATION).get("id", id).getSingle();
502        if (annotNode != null) {
503            // delete related objects
504            Transaction tx = graphDb.beginTx();
505            try {
506                for (Relationship rel : annotNode.getRelationships()) {
507                    // delete relation and the related node if it has no other
508                    // relations
509                    Node other = rel.getOtherNode(annotNode);
510                    rel.delete();
511                    if (!other.hasRelationship()) {
512                        deleteNode(other);
513                    }
514                }
515                if (!annotNode.hasRelationship()) {
516                    deleteNode(annotNode);
517                } else {
518                    logger.error("deleteById: unable to delete: Node still has relations.");
519                }
520                tx.success();
521            } finally {
522                tx.finish();
523            }
524        }
525    }
526
527    /**
528     * Returns all annotations with the given uri and/or user.
529     *
530     * @param uri
531     * @param userUri
532     * @param limit
533     * @param offset
534     * @return
535     */
536    public List<Annotation> searchByUriUser(String targetUri, String userUri, String limit, String offset) {
537        List<Annotation> annotations = new ArrayList<Annotation>();
538        if (targetUri != null) {
539            // there should be only one
540            Node target = getNodeIndex(NodeTypes.TARGET).get("uri", targetUri).getSingle();
541            if (target != null) {
542                Iterable<Relationship> relations = target.getRelationships(RelationTypes.ANNOTATES);
543                for (Relationship relation : relations) {
544                    Node ann = relation.getStartNode();
545                    if (ann.getProperty("TYPE", "").equals("ANNOTATION")) {
546                        Annotation annot = createAnnotationFromNode(ann);
547                        annotations.add(annot);
548                    } else {
549                        logger.error("ANNOTATES relation does not start with ANNOTATION: " + ann);
550                    }
551                }
552            }
553        }
554        if (userUri != null) {
555            // there should be only one
556            Node person = getPersonNodeByUri(userUri);
557            if (person != null) {
558                Iterable<Relationship> relations = person.getRelationships(RelationTypes.CREATED);
559                for (Relationship relation : relations) {
560                    Node ann = relation.getEndNode();
561                    if (ann.getProperty("TYPE", "").equals("ANNOTATION")) {
562                        Annotation annot = createAnnotationFromNode(ann);
563                        annotations.add(annot);
564                    } else {
565                        logger.error("CREATED relation does not end with ANNOTATION: " + ann);
566                    }
567                }
568            }
569        }
570        // TODO: if both uri and user are given we should intersect
571        return annotations;
572    }
573
574    /**
575     * Returns Relationship of type from Node start to Node end. Creates one if
576     * it doesn't exist.
577     *
578     * @param start
579     * @param type
580     * @param end
581     * @return
582     */
583    protected Relationship getOrCreateRelation(Node start, RelationshipType type, Node end) {
584        if (start.hasRelationship()) {
585            // there are relations
586            Iterable<Relationship> rels = start.getRelationships(type, Direction.OUTGOING);
587            for (Relationship rel : rels) {
588                if (rel.getEndNode().equals(end)) {
589                    // relation exists
590                    return rel;
591                }
592            }
593        }
594        // create new one
595        Relationship rel;
596        Transaction tx = graphDb.beginTx();
597        try {
598            rel = start.createRelationshipTo(end, type);
599            tx.success();
600        } finally {
601            tx.finish();
602        }
603        return rel;
604    }
605
606    protected Node getOrCreateAnnotationNode(String id) {
607        Index<Node> idx = getNodeIndex(NodeTypes.ANNOTATION);
608        IndexHits<Node> annotations = idx.get("id", id);
609        Node annotation = annotations.getSingle();
610        if (annotation == null) {
611            // does not exist yet
612            Transaction tx = graphDb.beginTx();
613            try {
614                annotation = graphDb.createNode();
615                annotation.setProperty("TYPE", NodeTypes.ANNOTATION.name());
616                annotation.setProperty("id", id);
617                idx.add(annotation, "id", id);
618                tx.success();
619            } finally {
620                tx.finish();
621            }
622        }
623        return annotation;
624    }
625
626    protected Node getOrCreateTargetNode(String uri) {
627        Index<Node> idx = getNodeIndex(NodeTypes.TARGET);
628        IndexHits<Node> targets = idx.get("uri", uri);
629        Node target = targets.getSingle();
630        if (target == null) {
631            // does not exist yet
632            Transaction tx = graphDb.beginTx();
633            try {
634                target = graphDb.createNode();
635                target.setProperty("TYPE", NodeTypes.TARGET.name());
636                target.setProperty("uri", uri);
637                idx.add(target, "uri", uri);
638                tx.success();
639            } finally {
640                tx.finish();
641            }
642        }
643        return target;
644    }
645
646    protected Node getActorNode(Actor actor) {
647        // Person/Group is identified by URI or id
648        String uri = actor.getUriString();
649        Index<Node> idx;
650        if (actor.isGroup()) {
651            idx = getNodeIndex(NodeTypes.GROUP);
652        } else {
653            idx = getNodeIndex(NodeTypes.PERSON);
654        }
655        IndexHits<Node> persons = idx.get("uri", uri);
656        Node person = persons.getSingle();
657        return person;
658    }
659   
660    protected Node getOrCreateActorNode(Actor actor) {
661        // Person/Group is identified by URI or id
662        String uri = actor.getUriString();
663        String name = actor.getName();
664        String id = actor.getId();
665        Index<Node> idx;
666        if (actor.isGroup()) {
667            idx = getNodeIndex(NodeTypes.GROUP);
668        } else {
669            idx = getNodeIndex(NodeTypes.PERSON);
670        }
671        IndexHits<Node> persons = idx.get("uri", uri);
672        Node person = persons.getSingle();
673        if (person == null) {
674            // does not exist yet
675            Transaction tx = graphDb.beginTx();
676            try {
677                person = graphDb.createNode();
678                if (actor.isGroup()) {
679                    person.setProperty("TYPE", NodeTypes.GROUP.name());
680                } else {
681                    person.setProperty("TYPE", NodeTypes.PERSON.name());
682                }
683                person.setProperty("uri", uri);
684                idx.add(person, "uri", uri);
685                if (name != null) {
686                    person.setProperty("name", name);
687                }
688                if (id != null) {
689                    person.setProperty("id", id);
690                }
691                tx.success();
692            } finally {
693                tx.finish();
694            }
695        }
696        return person;
697    }
698
699    protected Node getOrCreateTagNode(Tag inTag) {
700        Index<Node> idx = getNodeIndex(NodeTypes.TAG);
701        String tagname = inTag.getName();
702        IndexHits<Node> tags = idx.get("name", tagname);
703        Node tag = tags.getSingle();
704        if (tag == null) {
705            // does not exist yet
706            Transaction tx = graphDb.beginTx();
707            try {
708                tag = graphDb.createNode();
709                tag.setProperty("TYPE", NodeTypes.TAG.name());
710                tag.setProperty("name", tagname);
711                idx.add(tag, "name", tagname);
712               
713                tag.setProperty("id", inTag.getId());
714                tag.setProperty("uri", inTag.getUri());
715                idx.add(tag, "uri", inTag.getUri());
716               
717                tx.success();
718            } finally {
719                tx.finish();
720            }
721        }
722        return tag;
723    }
724
725    /**
726     * Create or update permissions relations for an annotation.
727     *
728     * @param annotNode
729     * @param type
730     * @param annot
731     */
732    protected void setPermissionRelation(Node annotNode, RelationTypes type, Actor actor) {
733        Node newActorNode = null;
734        if (actor != null) {
735            newActorNode = getOrCreateActorNode(actor);
736        }
737        Relationship rel = getRelation(annotNode, type, null);
738        if (rel != null) {
739            // relation exists
740            Node oldActorNode = rel.getEndNode();
741            if (!oldActorNode.equals(newActorNode)) {
742                // new admin is different
743                rel.delete();
744                if (newActorNode != null) {
745                    rel = getOrCreateRelation(annotNode, type, newActorNode);
746                }
747            }
748        } else {
749            // no relation yet
750            if (newActorNode != null) {
751                rel = getOrCreateRelation(annotNode, type, newActorNode);
752            }
753        }
754    }
755
756    /**
757     * Unindexes and deletes given Node if it has no relations.
758     *
759     * @param node
760     */
761    protected void deleteNode(Node node) {
762        Transaction tx = graphDb.beginTx();
763        try {
764            if (node.hasRelationship()) {
765                logger.error("deleteNode: unable to delete: Node still has relations.");
766            } else {
767                String ts = (String) node.getProperty("TYPE", null);
768                try {
769                    NodeTypes type = NodeTypes.valueOf(ts);
770                    getNodeIndex(type).remove(node);
771                } catch (Exception e) {
772                    logger.error("deleteNode: unable to get TYPE of node: " + node);
773                }
774                node.delete();
775            }
776            tx.success();
777        } finally {
778            tx.finish();
779        }
780    }
781
782    /**
783     * returns the (first) Relationship of RelationTypes type from Node start.
784     *
785     * @param start
786     * @param type
787     * @param direction
788     * @return
789     */
790    protected Relationship getRelation(Node start, RelationTypes type, Direction direction) {
791        Iterable<Relationship> rels;
792        if (direction == null) {
793            // ignore direction
794            rels = start.getRelationships(type);
795        } else {
796            rels = start.getRelationships(type, direction);
797        }
798        for (Relationship rel : rels) {
799            // just the first one
800            return rel;
801        }
802        return null;
803    }
804
805    /**
806     * Erzeuge eine urn aus der aktuellen Zeit in millis
807     *
808     * @return
809     */
810    private String createRessourceURI(String prefix) {
811
812        Calendar cal = Calendar.getInstance();
813
814        long time = cal.getTimeInMillis();
815
816        return String.format("%s%s%s", ANNOTATION_URI_BASE, prefix, time);
817
818    }
819
820        public List<Annotation> getAnnotationsByTag(String tagUri) {
821               
822                ArrayList<Annotation> ret = new  ArrayList<Annotation>();
823                Node tag = getTagNodeByUri(tagUri);
824               
825               
826                Iterable<Relationship> rels = tag.getRelationships(Direction.INCOMING,RelationTypes.HAS_TAG);
827               
828                for (Relationship rel:rels){
829                        Node node = rel.getStartNode();
830                        ret.add(createAnnotationFromNode(node));
831                       
832                }
833                return ret;
834        }
835
836}
Note: See TracBrowser for help on using the repository browser.