private DataElement traverseTree(TripleBuilder builder, WordTree tree, TreeElement current) {

        Map<Integer, DataElement> cache = new HashMap<Integer, DataElement>();

        List<TreeElement> childs = tree.getChildsOf(current);
        boolean isFork = childs.size() > 1;

        for (TreeElement element : childs) {

            DataElement last = traverseTree(builder, tree, element);

            if (last != null) {
                cache.put(element.getId(), last);
            }

        }

        DataElement data;
        if (!isFork && cache.entrySet().size() == 1) {
            data = handleElement(current, cache.entrySet().iterator().next().getValue());
        } else {
            data = handleElement(current, null);
        }

        if (isFork) {
            for (Entry<Integer, DataElement> cached : cache.entrySet()) {
                builder.cacheElement(cached.getValue(), cached.getKey());
            }
        }

        if ((current.isRoot() || isFork) && current.getType().isVerb()) {
            builder.flushSentence(data);
            data = null;
        }

        return data;
    }