⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filesystemretrieval.java

📁 基于MPEG 7 标准,符合未来语义网架构,很值得参考
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            }
            // Sorting Vector ...
            Collections.sort(results, new Comparator() {
                public int compare(Object o1, Object o2) {
                    int retVal = 0;
                    double rel = ((ResultListEntry) o1).getRelevance() - ((ResultListEntry) o2).getRelevance();
                    if (rel < 0) retVal = -1;
                    if (rel > 0) retVal = 1;
                    return retVal;
                }
            });

        } catch (Exception e) {
            debug("Couldn't find descriptions ... " + e.getMessage());
        }
        return results;
    }

    public List<ResultListEntry> getImagesBySemantics(String xPath, Vector objects, String whereToSearch,
                                                      boolean recursive, JProgressBar progress) {

        LinkedList<ResultListEntry> results = new LinkedList<ResultListEntry>();
        boolean isResult = false;
        try {
            if (progress != null)
                progress.setString("Finding MPEG-7 files ...");
            String[] descriptions = FileOperations.getAllDescriptions(new File(whereToSearch), recursive);
            double[] diffs = new double[descriptions.length];
            for (int i = 0; i < diffs.length; i++) {
                diffs[i] = -1.0;
            }
            SAXBuilder builder = new SAXBuilder();
            if (progress != null) {
                progress.setMinimum(0);
                progress.setMaximum(descriptions.length);
                progress.setValue(0);
                progress.setString("Searching for XPath ...");
            }
            double[] maxdiff = new double[MAX_COUNT];
            for (int i = 0; i < maxdiff.length; i++) {
                maxdiff[i] = -1.0;
            }
            for (int i = 0; i < descriptions.length; i++) {
                Element e = null;
                try {
                    e = builder.build(descriptions[i]).getRootElement();
                    java.util.List l = RetrievalToolkit.xpathQuery(e, xPath, null);
                    isResult = false;
                    if (l.size() > 0) {
                        isResult = true;
                        Element semantics = (Element) l.get(0);
                        Namespace mpeg7 = semantics.getNamespace();

                        java.util.List rels = semantics.getChild("Graph", mpeg7).getChildren("Relation", mpeg7);
                        java.util.List obje = semantics.getChildren("SemanticBase", mpeg7);

                        String rel1 = (String) objects.get(3);
                        String rel2 = (String) objects.get(4);

                        boolean rel1OK = false;
                        boolean rel2OK = false;

                        debug("found Element matching XPath Statement ....");
                        // checking relation 1
                        if (rel1.length() > 0) {
                            if (rel1.equals("*")) {
                                for (Iterator it1 = rels.iterator(); it1.hasNext();) {
                                    Element relation = (Element) it1.next();
                                    // test if objects are referenced:
                                    boolean inverse = false;
                                    if (((String) objects.get(5)).length() > 0) inverse = true;
                                    if (isValidRelation(relation, (String) objects.get(0), (String) objects.get(1), obje, inverse, 1)) {
                                        rel1OK = true;
                                    }
                                }
                            } else {
                                for (Iterator it1 = rels.iterator(); it1.hasNext();) {
                                    Element relation = (Element) it1.next();
                                    if (relation.getAttributeValue("type").endsWith(":" + rel1)) {
                                        // test if objects are referenced:
                                        boolean inverse = false;
                                        if (((String) objects.get(5)).length() > 0) inverse = true;
                                        if (isValidRelation(relation, (String) objects.get(0), (String) objects.get(1), obje, inverse, 1)) {
                                            rel1OK = true;
                                        }
                                    }
                                }
                            }
                        } else {
                            rel1OK = true;
                        }

                        // Checking relation 2
                        if (rel2.length() > 0) {
                            if (rel2.equals("*")) {
                                for (Iterator it1 = rels.iterator(); it1.hasNext();) {
                                    Element relation = (Element) it1.next();
                                    // test if objects are referenced:
                                    boolean inverse = false;
                                    if (((String) objects.get(6)).length() > 0) inverse = true;
                                    if (isValidRelation(relation, (String) objects.get(1), (String) objects.get(2), obje, inverse, 2)) {
                                        rel2OK = true;
                                    }
                                }
                            } else {
                                for (Iterator it1 = rels.iterator(); it1.hasNext();) {
                                    Element relation = (Element) it1.next();
                                    if (relation.getAttributeValue("type").endsWith(":" + rel2)) {
                                        // test if objects are referenced:
                                        boolean inverse = false;
                                        if (((String) objects.get(6)).length() > 0) inverse = true;
                                        if (isValidRelation(relation, (String) objects.get(1), (String) objects.get(2), obje, inverse, 2)) {
                                            rel2OK = true;
                                        }
                                    }
                                }
                            }
                        } else {
                            rel2OK = true;
                        }

                        if (rel2.length() > 0) {
                        }

                        isResult = rel1OK && rel2OK;
                    }
                    if (isResult) {
                        diffs[i] = 1.0 / (double) l.size();
                        if (i == MAX_COUNT) {
                            Arrays.sort(maxdiff);
                        }
                        if (i < MAX_COUNT) {
                            maxdiff[i] = diffs[i];
                            results.add(new ResultListEntry(diffs[i], e, descriptions[i]));
                        } else {
                            if (diffs[i] <= maxdiff[MAX_COUNT - 1] || maxdiff[MAX_COUNT - 1] < 0) {
                                results.add(new ResultListEntry(diffs[i], e, descriptions[i]));
                                maxdiff[MAX_COUNT - 1] = diffs[i];
                                for (int jj = MAX_COUNT - 1; jj > 0; jj--) {
                                    // bubble up :)
                                    if (maxdiff[jj - 1] > maxdiff[jj]) {
                                        double tmp = maxdiff[jj - 1];
                                        maxdiff[jj - 1] = maxdiff[jj];
                                        maxdiff[jj] = tmp;
                                    }
                                }
                            } else {
                                debug("Result omitted!");
                            }
                        }
                    }
                    l = null;
                    if (progress != null)
                        progress.setValue(i);
                } catch (JDOMException e1) {
                    debug("Error building document " + descriptions[i]);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
            // setting up results:

            if (progress != null) {
                progress.setMinimum(0);
                progress.setMaximum(descriptions.length);
                progress.setValue(0);
                progress.setString("Sorting images");
            }
            // Sorting Vector ...
            Collections.sort(results, new Comparator() {
                public int compare(Object o1, Object o2) {
                    int retVal = 0;
                    double rel = ((ResultListEntry) o1).getRelevance() - ((ResultListEntry) o2).getRelevance();
                    if (rel < 0) retVal = -1;
                    if (rel > 0) retVal = 1;
                    return retVal;
                }
            });

        } catch (Exception e) {
            debug("Couldn't find descriptions ... " + e.getMessage());
            e.printStackTrace(System.out);
        }
        return results;
    }

    private void debug(String message) {
        if (RetrievalFrame.DEBUG)
            System.out.println("[at.lux.fotoretrieval.retrievalengines.FileSystemRetrieval] " + message);
    }

    private boolean isValidRelation(Element relation, String obj1, String obj2, java.util.List objects, boolean inverse, int numRelation) {
        boolean isValid = false;
        if (inverse) debug("Searching for inverse relation");
        Namespace mpeg7 = relation.getNamespace();
        String src = relation.getAttributeValue("source");
        String tgt = relation.getAttributeValue("target");
        Element target = null;
        Element source = null;
        for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
            Element obj = (Element) iterator.next();
            String id = obj.getAttributeValue("id");
            if (id != null) {
                if (tgt.substring(1).equals(id)) {
                    target = obj;
//                    debug("Target: " + obj.getChild("Label", mpeg7).getChildTextTrim("Name", mpeg7));
                }
                if (src.substring(1).equals(id)) {
                    source = obj;
//                    debug("Source: " + obj.getChild("Label", mpeg7).getChildTextTrim("Name", mpeg7));
                }
            }

        }

        debug("Checking relation: " + relation.getAttributeValue("type") + " src: " + source.getChild("Label", mpeg7).getChildTextTrim("Name", mpeg7) + ", tgt: " + target.getChild("Label", mpeg7).getChildTextTrim("Name", mpeg7));
        if (!inverse) {
            debug("for source contains '" + obj1 + "' and target contains '" + obj2 + "'");
        } else {
            debug("for source contains '" + obj2 + "' and target contains '" + obj1 + "'");
        }

        if (target != null && source != null) {
            int hits1 = 1;
            if (!obj1.equals("*")) {
                if (!inverse) {
                    hits1 = RetrievalToolkit.xpathQuery(source, "*[contains(descendant-or-self::node(),'" + obj1 + "')]", null).size();
                } else {
                    hits1 += RetrievalToolkit.xpathQuery(target, "*[contains(descendant-or-self::node(),'" + obj1 + "')]", null).size();
                }
            }
            int hits2 = 1;
            if (!obj2.equals("*")) {
                if (!inverse) {
                    hits2 = RetrievalToolkit.xpathQuery(target, "*[contains(descendant-or-self::node(),'" + obj2 + "')]", null).size();
                } else {
                    hits2 += RetrievalToolkit.xpathQuery(source, "*[contains(descendant-or-self::node(),'" + obj2 + "')]", null).size();
                }
            }
            if (hits1 > 0 && hits2 > 0) {
                isValid = true;
                if (numRelation == 1) {
                    if (inverse) {
                        matches1.add(source);
                    } else {
                        matches1.add(target);
                    }
                } else {

                    if (inverse) {
                        isValid = matches1.contains(target);
                    } else {
                        isValid = matches1.contains(source);
                    }
//                    isValid = (matches1.contains(target) || matches1.contains(source));

                }
                debug("Match detected!");
            }
        }
        return isValid;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -