source: AnnotationManagerN4J/src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java @ 25:2140ef107551

Last change on this file since 25:2140ef107551 was 25:2140ef107551, checked in by casties, 12 years ago

adding and deleting group members.

File size: 27.0 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;
27
28/**
29 * @author casties
30 *
31 */
32public class AnnotationStore {
33
34    protected static Logger logger = Logger.getLogger(AnnotationStore.class);
35
36    protected GraphDatabaseService graphDb;
37
38    public static enum NodeTypes {
39        ANNOTATION, PERSON, TARGET, GROUP, TAG
40    }
41
42    protected List<Index<Node>> nodeIndexes;
43
44    public static enum RelationTypes implements RelationshipType {
45        ANNOTATES, CREATED, PERMITS_ADMIN, PERMITS_DELETE, PERMITS_UPDATE, PERMITS_READ, MEMBER_OF, HAS_TAG
46    }
47
48    public static String ANNOTATION_URI_BASE = "http://entities.mpiwg-berlin.mpg.de/annotations/";
49
50    public AnnotationStore(GraphDatabaseService graphDb) {
51        super();
52        this.graphDb = graphDb;
53        nodeIndexes = new ArrayList<Index<Node>>(5);
54        // List.set(enum.ordinal(), val) seems not to work.
55        nodeIndexes.add(NodeTypes.ANNOTATION.ordinal(), graphDb.index().forNodes("annotations"));
56        nodeIndexes.add(NodeTypes.PERSON.ordinal(), graphDb.index().forNodes("persons"));
57        nodeIndexes.add(NodeTypes.TARGET.ordinal(), graphDb.index().forNodes("targets"));
58        nodeIndexes.add(NodeTypes.GROUP.ordinal(), graphDb.index().forNodes("groups"));
59        nodeIndexes.add(NodeTypes.TAG.ordinal(), graphDb.index().forNodes("tags"));
60    }
61
62    protected Index<Node> getNodeIndex(NodeTypes type) {
63        return nodeIndexes.get(type.ordinal());
64    }
65
66    /**
67     * @param userUri
68     * @return
69     */
70    public Node getPersonNodeByUri(String userUri) {
71        if (userUri == null) return null;
72        Node person = getNodeIndex(NodeTypes.PERSON).get("uri", userUri).getSingle();
73        return person;
74    }
75
76    public List<Actor> getActors(String key, String query, NodeTypes type) {
77        ArrayList<Actor> actors = new ArrayList<Actor>();
78        Index<Node> idx = getNodeIndex(type);
79        if (key == null) {
80            key = "uri";
81            query = "*";
82        }
83        IndexHits<Node> actorNodes = idx.query(key, query);
84        for (Node actorNode : actorNodes) {
85            Actor actor = createActorFromNode(actorNode);
86            actors.add(actor);
87        }
88        return actors;
89    }
90
91    /**
92     * Returns List of Groups.
93     * Key has to be indexed.
94     *
95     * @param key
96     * @param query
97     * @return
98     */
99    public List<Group> getGroups(String key, String query) {
100        ArrayList<Group> groups = new ArrayList<Group>();
101        Index<Node> idx = getNodeIndex(NodeTypes.GROUP);
102        if (key == null) {
103            key = "uri";
104            query = "*";
105        }
106        IndexHits<Node> groupNodes = idx.query(key, query);
107        for (Node groupNode : groupNodes) {
108            Actor group = createActorFromNode(groupNode);
109            groups.add((Group) group);
110        }
111        return groups;
112    }
113
114    /**
115     * Returns List of Groups the person is member of.
116     *
117     * @param person
118     * @return
119     */
120    public List<Group> getGroupsForPersonNode(Node person) {
121        ArrayList<Group> groups = new ArrayList<Group>();
122        Iterable<Relationship> rels = person.getRelationships(RelationTypes.MEMBER_OF);
123        for (Relationship rel : rels) {
124            Node groupNode = rel.getEndNode();
125            Actor group = createActorFromNode(groupNode);
126            // make sure we're getting a group
127            if (!(group instanceof Group)) {
128                logger.error("target of MEMBER_OF is not GROUP! rel=" + rel);
129                continue;
130            }
131            groups.add((Group) group);
132        }
133        return groups;
134    }
135
136    /**
137     * Returns if person with uri is in Group group.
138     *
139     * @param person
140     * @param group
141     * @return
142     */
143    public boolean isPersonInGroup(Person person, Group group) {
144        Node pn = getPersonNodeByUri(person.getUriString());
145        if (pn == null) return false;
146        // optimized version of getGroupsForPersonNode
147        Iterable<Relationship> rels = pn.getRelationships(RelationTypes.MEMBER_OF);
148        for (Relationship rel : rels) {
149            Node gn = rel.getEndNode();
150            if (gn.getProperty("uri", "").equals(group.getUriString()) || gn.getProperty("id", "").equals(group.getId())) {
151                return true;
152            }
153        }
154        return false;
155    }
156
157    /**
158     * Returns the members of the group.
159     *
160     * @param group
161     * @return
162     */
163    public List<Person> getMembersOfGroup(Group group) {
164        ArrayList<Person> members = new ArrayList<Person>();
165        Node gn = getActorNode(group);
166        Iterable<Relationship> rels = gn.getRelationships(RelationTypes.MEMBER_OF);
167        for (Relationship rel : rels) {
168            Node memberNode = rel.getStartNode();
169            Actor member = createActorFromNode(memberNode);
170            // make sure we're getting a group
171            if (!(member instanceof Person)) {
172                logger.error("source of MEMBER_OF is not PERSON! rel=" + rel);
173                continue;
174            }
175            members.add((Person) member);
176        }
177        return members;
178    }
179   
180    /**
181     * Add Person newMember to Group group.
182     *
183     * @param group
184     * @param member
185     */
186    public Person addGroupMember(Group group, Person member) {
187        Node gn = getActorNode(group);
188        Node pn = getActorNode(member);
189        Person addedMember = null;
190        if (gn != null && pn != null) {
191            getOrCreateRelation(pn, RelationTypes.MEMBER_OF, gn);
192            addedMember = member;
193        }
194        return addedMember;
195    }
196   
197    /**
198     * Delete Person oldMember from Group group.
199     *
200     * @param group
201     * @param member
202     */
203    public void deleteGroupMember(Group group, Person member) {
204        Node gn = getActorNode(group);
205        Iterable<Relationship> rels = gn.getRelationships(RelationTypes.MEMBER_OF);
206        for (Relationship rel : rels) {
207            Node mn = rel.getStartNode();
208            if (mn.equals(member)) {
209                rel.delete();
210                // there should be only one
211                break;
212            }
213        }       
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    /**
355     * Store a new annotation in the store or update an existing one. Returns
356     * the stored annotation.
357     *
358     * @param annot
359     * @return
360     */
361    public Annotation storeAnnotation(Annotation annot) {
362        Node annotNode = null;
363        Transaction tx = graphDb.beginTx();
364        try {
365            /*
366             * create or get the annotation
367             */
368            String id = annot.getUri();
369            if (id == null) {
370                id = createRessourceURI("annot:");
371            }
372            annotNode = getOrCreateAnnotationNode(id);
373
374            /*
375             * the annotation body
376             */
377            String bodyText = annot.getBodyText();
378            if (bodyText != null) {
379                annotNode.setProperty("bodyText", bodyText);
380            }
381            String bodyUri = annot.getBodyUri();
382            if (bodyUri != null) {
383                annotNode.setProperty("bodyUri", bodyUri);
384            }
385
386            /*
387             * the annotation target
388             */
389            String targetBaseUri = annot.getTargetBaseUri();
390            if (targetBaseUri != null) {
391                Node target = getOrCreateTargetNode(targetBaseUri);
392                getOrCreateRelation(annotNode, RelationTypes.ANNOTATES, target);
393            }
394
395            /*
396             * The fragment part of the annotation target.
397             */
398            String targetFragment = annot.getTargetFragment();
399            FragmentTypes fragmentType = annot.getFragmentType();
400            if (targetFragment != null) {
401                annotNode.setProperty("targetFragment", targetFragment);
402                annotNode.setProperty("fragmentType", fragmentType.name());
403            }
404
405            /*
406             * The creator of this annotation.
407             */
408            Actor creator = annot.getCreator();
409            if (creator != null) {
410                Node creatorNode = getOrCreateActorNode(creator);
411                getOrCreateRelation(creatorNode, RelationTypes.CREATED, annotNode);
412            }
413
414            /*
415             * The creation date of this annotation.
416             */
417            String created = annot.getCreated();
418            if (created != null) {
419                annotNode.setProperty("created", created);
420            }
421
422            /*
423             * Permissions for this annotation.
424             */
425            setPermissionRelation(annotNode, RelationTypes.PERMITS_ADMIN, annot.getAdminPermission());
426            setPermissionRelation(annotNode, RelationTypes.PERMITS_DELETE, annot.getDeletePermission());
427            setPermissionRelation(annotNode, RelationTypes.PERMITS_UPDATE, annot.getUpdatePermission());
428            setPermissionRelation(annotNode, RelationTypes.PERMITS_READ, annot.getReadPermission());
429
430            /*
431             * Tags on this annotation.
432             */
433            Set<String> newTags = annot.getTags();
434            // we ignore existing tags if tags == null
435            if (newTags != null) {
436                List<Relationship> oldHasTags = new ArrayList<Relationship>();
437                for (Relationship rel : annotNode.getRelationships(RelationTypes.HAS_TAG)) {
438                    oldHasTags.add(rel);
439                }
440                // adjust to new tags
441                if (newTags.isEmpty()) {
442                    // remove old tags
443                    if (!oldHasTags.isEmpty()) {
444                        for (Relationship rel : oldHasTags) {
445                            rel.delete();
446                            // TODO: should we delete orphan nodes too?
447                        }
448                    }
449                } else {
450                    if (!oldHasTags.isEmpty()) {
451                        // adjust old tags
452                        for (Relationship rel : oldHasTags) {
453                            String oldTag = (String) rel.getEndNode().getProperty("name", null);
454                            if (newTags.contains(oldTag)) {
455                                // tag exists
456                                newTags.remove(oldTag);
457                            } else {
458                                // tag exists no longer
459                                rel.delete();
460                                // TODO: should we delete orphan nodes too?
461                            }
462                        }
463                    }
464                    if (!newTags.isEmpty()) {
465                        // still tags to add
466                        for (String tag : newTags) {
467                            // create new tag
468                            Node tagNode = getOrCreateTagNode(tag);
469                            getOrCreateRelation(annotNode, RelationTypes.HAS_TAG, tagNode);
470                        }
471                    }
472
473                }
474            }
475            tx.success();
476        } finally {
477            tx.finish();
478        }
479
480        // re-read and return annotation
481        Annotation storedAnnot = createAnnotationFromNode(annotNode);
482        return storedAnnot;
483    }
484
485    /**
486     * Deletes the annotation with the given id.
487     *
488     * @param id
489     */
490    public void deleteById(String id) {
491        Node annotNode = getNodeIndex(NodeTypes.ANNOTATION).get("id", id).getSingle();
492        if (annotNode != null) {
493            // delete related objects
494            Transaction tx = graphDb.beginTx();
495            try {
496                for (Relationship rel : annotNode.getRelationships()) {
497                    // delete relation and the related node if it has no other
498                    // relations
499                    Node other = rel.getOtherNode(annotNode);
500                    rel.delete();
501                    if (!other.hasRelationship()) {
502                        deleteNode(other);
503                    }
504                }
505                if (!annotNode.hasRelationship()) {
506                    deleteNode(annotNode);
507                } else {
508                    logger.error("deleteById: unable to delete: Node still has relations.");
509                }
510                tx.success();
511            } finally {
512                tx.finish();
513            }
514        }
515    }
516
517    /**
518     * Returns all annotations with the given uri and/or user.
519     *
520     * @param uri
521     * @param userUri
522     * @param limit
523     * @param offset
524     * @return
525     */
526    public List<Annotation> searchByUriUser(String targetUri, String userUri, String limit, String offset) {
527        List<Annotation> annotations = new ArrayList<Annotation>();
528        if (targetUri != null) {
529            // there should be only one
530            Node target = getNodeIndex(NodeTypes.TARGET).get("uri", targetUri).getSingle();
531            if (target != null) {
532                Iterable<Relationship> relations = target.getRelationships(RelationTypes.ANNOTATES);
533                for (Relationship relation : relations) {
534                    Node ann = relation.getStartNode();
535                    if (ann.getProperty("TYPE", "").equals("ANNOTATION")) {
536                        Annotation annot = createAnnotationFromNode(ann);
537                        annotations.add(annot);
538                    } else {
539                        logger.error("ANNOTATES relation does not start with ANNOTATION: " + ann);
540                    }
541                }
542            }
543        }
544        if (userUri != null) {
545            // there should be only one
546            Node person = getPersonNodeByUri(userUri);
547            if (person != null) {
548                Iterable<Relationship> relations = person.getRelationships(RelationTypes.CREATED);
549                for (Relationship relation : relations) {
550                    Node ann = relation.getEndNode();
551                    if (ann.getProperty("TYPE", "").equals("ANNOTATION")) {
552                        Annotation annot = createAnnotationFromNode(ann);
553                        annotations.add(annot);
554                    } else {
555                        logger.error("CREATED relation does not end with ANNOTATION: " + ann);
556                    }
557                }
558            }
559        }
560        // TODO: if both uri and user are given we should intersect
561        return annotations;
562    }
563
564    /**
565     * Returns Relationship of type from Node start to Node end. Creates one if
566     * it doesn't exist.
567     *
568     * @param start
569     * @param type
570     * @param end
571     * @return
572     */
573    protected Relationship getOrCreateRelation(Node start, RelationshipType type, Node end) {
574        if (start.hasRelationship()) {
575            // there are relations
576            Iterable<Relationship> rels = start.getRelationships(type, Direction.OUTGOING);
577            for (Relationship rel : rels) {
578                if (rel.getEndNode().equals(end)) {
579                    // relation exists
580                    return rel;
581                }
582            }
583        }
584        // create new one
585        Relationship rel;
586        Transaction tx = graphDb.beginTx();
587        try {
588            rel = start.createRelationshipTo(end, type);
589            tx.success();
590        } finally {
591            tx.finish();
592        }
593        return rel;
594    }
595
596    protected Node getOrCreateAnnotationNode(String id) {
597        Index<Node> idx = getNodeIndex(NodeTypes.ANNOTATION);
598        IndexHits<Node> annotations = idx.get("id", id);
599        Node annotation = annotations.getSingle();
600        if (annotation == null) {
601            // does not exist yet
602            Transaction tx = graphDb.beginTx();
603            try {
604                annotation = graphDb.createNode();
605                annotation.setProperty("TYPE", NodeTypes.ANNOTATION.name());
606                annotation.setProperty("id", id);
607                idx.add(annotation, "id", id);
608                tx.success();
609            } finally {
610                tx.finish();
611            }
612        }
613        return annotation;
614    }
615
616    protected Node getOrCreateTargetNode(String uri) {
617        Index<Node> idx = getNodeIndex(NodeTypes.TARGET);
618        IndexHits<Node> targets = idx.get("uri", uri);
619        Node target = targets.getSingle();
620        if (target == null) {
621            // does not exist yet
622            Transaction tx = graphDb.beginTx();
623            try {
624                target = graphDb.createNode();
625                target.setProperty("TYPE", NodeTypes.TARGET.name());
626                target.setProperty("uri", uri);
627                idx.add(target, "uri", uri);
628                tx.success();
629            } finally {
630                tx.finish();
631            }
632        }
633        return target;
634    }
635
636    protected Node getActorNode(Actor actor) {
637        // Person/Group is identified by URI or id
638        String uri = actor.getUriString();
639        Index<Node> idx;
640        if (actor.isGroup()) {
641            idx = getNodeIndex(NodeTypes.GROUP);
642        } else {
643            idx = getNodeIndex(NodeTypes.PERSON);
644        }
645        IndexHits<Node> persons = idx.get("uri", uri);
646        Node person = persons.getSingle();
647        return person;
648    }
649   
650    protected Node getOrCreateActorNode(Actor actor) {
651        // Person/Group is identified by URI or id
652        String uri = actor.getUriString();
653        String name = actor.getName();
654        String id = actor.getId();
655        Index<Node> idx;
656        if (actor.isGroup()) {
657            idx = getNodeIndex(NodeTypes.GROUP);
658        } else {
659            idx = getNodeIndex(NodeTypes.PERSON);
660        }
661        IndexHits<Node> persons = idx.get("uri", uri);
662        Node person = persons.getSingle();
663        if (person == null) {
664            // does not exist yet
665            Transaction tx = graphDb.beginTx();
666            try {
667                person = graphDb.createNode();
668                if (actor.isGroup()) {
669                    person.setProperty("TYPE", NodeTypes.GROUP.name());
670                } else {
671                    person.setProperty("TYPE", NodeTypes.PERSON.name());
672                }
673                person.setProperty("uri", uri);
674                idx.add(person, "uri", uri);
675                if (name != null) {
676                    person.setProperty("name", name);
677                }
678                if (id != null) {
679                    person.setProperty("id", id);
680                }
681                tx.success();
682            } finally {
683                tx.finish();
684            }
685        }
686        return person;
687    }
688
689    protected Node getOrCreateTagNode(String tagname) {
690        Index<Node> idx = getNodeIndex(NodeTypes.TAG);
691        IndexHits<Node> tags = idx.get("name", tagname);
692        Node tag = tags.getSingle();
693        if (tag == null) {
694            // does not exist yet
695            Transaction tx = graphDb.beginTx();
696            try {
697                tag = graphDb.createNode();
698                tag.setProperty("TYPE", NodeTypes.TAG.name());
699                tag.setProperty("name", tagname);
700                idx.add(tag, "name", tagname);
701                tx.success();
702            } finally {
703                tx.finish();
704            }
705        }
706        return tag;
707    }
708
709    /**
710     * Create or update permissions relations for an annotation.
711     *
712     * @param annotNode
713     * @param type
714     * @param annot
715     */
716    protected void setPermissionRelation(Node annotNode, RelationTypes type, Actor actor) {
717        Node newActorNode = null;
718        if (actor != null) {
719            newActorNode = getOrCreateActorNode(actor);
720        }
721        Relationship rel = getRelation(annotNode, type, null);
722        if (rel != null) {
723            // relation exists
724            Node oldActorNode = rel.getEndNode();
725            if (!oldActorNode.equals(newActorNode)) {
726                // new admin is different
727                rel.delete();
728                if (newActorNode != null) {
729                    rel = getOrCreateRelation(annotNode, type, newActorNode);
730                }
731            }
732        } else {
733            // no relation yet
734            if (newActorNode != null) {
735                rel = getOrCreateRelation(annotNode, type, newActorNode);
736            }
737        }
738    }
739
740    /**
741     * Unindexes and deletes given Node if it has no relations.
742     *
743     * @param node
744     */
745    protected void deleteNode(Node node) {
746        Transaction tx = graphDb.beginTx();
747        try {
748            if (node.hasRelationship()) {
749                logger.error("deleteNode: unable to delete: Node still has relations.");
750            } else {
751                String ts = (String) node.getProperty("TYPE", null);
752                try {
753                    NodeTypes type = NodeTypes.valueOf(ts);
754                    getNodeIndex(type).remove(node);
755                } catch (Exception e) {
756                    logger.error("deleteNode: unable to get TYPE of node: " + node);
757                }
758                node.delete();
759            }
760            tx.success();
761        } finally {
762            tx.finish();
763        }
764    }
765
766    /**
767     * returns the (first) Relationship of RelationTypes type from Node start.
768     *
769     * @param start
770     * @param type
771     * @param direction
772     * @return
773     */
774    protected Relationship getRelation(Node start, RelationTypes type, Direction direction) {
775        Iterable<Relationship> rels;
776        if (direction == null) {
777            // ignore direction
778            rels = start.getRelationships(type);
779        } else {
780            rels = start.getRelationships(type, direction);
781        }
782        for (Relationship rel : rels) {
783            // just the first one
784            return rel;
785        }
786        return null;
787    }
788
789    /**
790     * Erzeuge eine urn aus der aktuellen Zeit in millis
791     *
792     * @return
793     */
794    private String createRessourceURI(String prefix) {
795
796        Calendar cal = Calendar.getInstance();
797
798        long time = cal.getTimeInMillis();
799
800        return String.format("%s%s%s", ANNOTATION_URI_BASE, prefix, time);
801
802    }
803
804}
Note: See TracBrowser for help on using the repository browser.