Index: src/main/java/de/mpiwg/itgroup/annotations/Resource.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/Resource.java	(revision 42)
+++ src/main/java/de/mpiwg/itgroup/annotations/Resource.java	(revision 42)
@@ -0,0 +1,19 @@
+/**
+ * 
+ */
+package de.mpiwg.itgroup.annotations;
+
+/**
+ * @author casties
+ *
+ */
+public class Resource extends Uri {
+
+    /**
+     * @param uri
+     */
+    public Resource(String uri) {
+        super(uri);
+    }
+
+}
Index: src/main/java/de/mpiwg/itgroup/annotations/Target.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/Target.java	(revision 42)
+++ src/main/java/de/mpiwg/itgroup/annotations/Target.java	(revision 42)
@@ -0,0 +1,19 @@
+/**
+ * 
+ */
+package de.mpiwg.itgroup.annotations;
+
+/**
+ * @author casties
+ *
+ */
+public class Target extends Uri {
+
+    /**
+     * @param uri
+     */
+    public Target(String uri) {
+        super(uri);
+    }
+
+}
Index: src/main/java/de/mpiwg/itgroup/annotations/Uri.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/Uri.java	(revision 42)
+++ src/main/java/de/mpiwg/itgroup/annotations/Uri.java	(revision 42)
@@ -0,0 +1,22 @@
+package de.mpiwg.itgroup.annotations;
+
+/**
+ * @author casties
+ * 
+ */
+public class Uri {
+
+    public String uri;
+
+    public Uri(String uri) {
+        this.uri = uri;
+    }
+
+    public String getUri() {
+        return uri;
+    }
+
+    public void setUri(String uri) {
+        this.uri = uri;
+    }
+}
Index: src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java	(revision 40)
+++ src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java	(revision 42)
@@ -26,5 +26,8 @@
 import de.mpiwg.itgroup.annotations.Group;
 import de.mpiwg.itgroup.annotations.Person;
+import de.mpiwg.itgroup.annotations.Resource;
 import de.mpiwg.itgroup.annotations.Tag;
+import de.mpiwg.itgroup.annotations.Target;
+import de.mpiwg.itgroup.annotations.Uri;
 
 /**
@@ -92,6 +95,31 @@
     }
 
-    public List<Actor> getActors(String key, String query, NodeTypes type) {
-        ArrayList<Actor> actors = new ArrayList<Actor>();
+    /**
+     * Returns the Node with the given key and value.
+     * Key has to be indexed.
+     * 
+     * @param key
+     * @param value
+     * @param type
+     * @return
+     */
+    public Node getNodeFromIndex(String key, String value, NodeTypes type) {
+        if (key == null || value == null) return null;
+        Node person = getNodeIndex(type).get(key, value).getSingle();
+        return person;
+    }
+
+    /**
+     * Returns list of Actors of given type (Group or Person).
+     * Key has to be indexed.
+     * 
+     * @param key
+     * @param query
+     * @param type
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public <T extends Actor> List<T> getActors(String key, String query, NodeTypes type) {
+        ArrayList<T> actors = new ArrayList<T>();
         Index<Node> idx = getNodeIndex(type);
         if (key == null) {
@@ -102,13 +130,11 @@
         for (Node actorNode : actorNodes) {
             Actor actor = createActorFromNode(actorNode);
-            actors.add(actor);
+            actors.add((T) actor);
         }
         return actors;
     }
-
-    /**
-     * Returns List of Groups.
-     * Key has to be indexed.
-     * 
+    
+    /**
+     * Returns list of groups. Key has to be indexed.
      * @param key
      * @param query
@@ -116,18 +142,67 @@
      */
     public List<Group> getGroups(String key, String query) {
-        ArrayList<Group> groups = new ArrayList<Group>();
-        Index<Node> idx = getNodeIndex(NodeTypes.GROUP);
+        List<Group> groups = getActors(key, query, NodeTypes.GROUP);
+        return groups;
+    }
+    
+    /**
+     * Returns list of Persons. Key has to be indexed.
+     * @param key
+     * @param query
+     * @return
+     */
+    public List<Person> getPersons(String key, String query) {
+        List<Person> persons = getActors(key, query, NodeTypes.PERSON);
+        return persons;
+    }
+    
+    /**
+     * Returns list of uri-like objects of given type (Target or Resource).
+     * Key has to be indexed.
+     * 
+     * @param key
+     * @param query
+     * @param type
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public <T extends Uri> List<T> getUris(String key, String query, NodeTypes type) {
+        ArrayList<T> uris = new ArrayList<T>();
+        Index<Node> idx = getNodeIndex(type);
         if (key == null) {
             key = "uri";
             query = "*";
         }
-        IndexHits<Node> groupNodes = idx.query(key, query);
-        for (Node groupNode : groupNodes) {
-            Actor group = createActorFromNode(groupNode);
-            groups.add((Group) group);
-        }
-        return groups;
-    }
-
+        IndexHits<Node> actorNodes = idx.query(key, query);
+        for (Node actorNode : actorNodes) {
+            Uri uri = createUriFromNode(actorNode);
+            uris.add((T) uri);
+        }
+        return uris;
+    }
+
+    
+    /**
+     * Returns list of Targets. Key has to be indexed.
+     * @param key
+     * @param query
+     * @return
+     */
+    public List<Target> getTargets(String key, String query) {
+        List<Target> targets = getUris(key, query, NodeTypes.TARGET);
+        return targets;
+    }
+    
+    /**
+     * Returns list of Resources. Key has to be indexed.
+     * @param key
+     * @param query
+     * @return
+     */
+    public List<Resource> getResources(String key, String query) {
+        List<Resource> targets = getUris(key, query, NodeTypes.RESOURCE);
+        return targets;
+    }
+    
     /**
      * Returns List of Annotations.
@@ -490,4 +565,16 @@
         return new Tag(id, uri, name);
 
+    }
+
+    protected Uri createUriFromNode(Node uriNode) {
+        if (uriNode == null) return null;
+        String uri = (String) uriNode.getProperty("uri", null);
+        String type = (String) uriNode.getProperty("TYPE", null);
+        if (type != null && type.equals("TARGET")) {
+            return new Target(uri);
+        } else if (type != null && type.equals("RESOURCE")) {
+            return new Resource(uri);
+        }
+        return null;
     }
 
@@ -981,3 +1068,14 @@
     }
 
+    public List<Annotation> getAnnotationsByResource(String resourceUri) {
+        ArrayList<Annotation> ret = new ArrayList<Annotation>();
+        Node tag = getNodeFromIndex("uri", resourceUri, NodeTypes.RESOURCE);
+        Iterable<Relationship> rels = tag.getRelationships(Direction.INCOMING, RelationTypes.ANNOTATES);
+        for (Relationship rel : rels) {
+            Node node = rel.getStartNode();
+            ret.add(createAnnotationFromNode(node));
+        }
+        return ret;
+    }
+
 }
