首页 > 解决方案 > 有没有办法“获取”一个属性而不是在 Xodus 中“找到”它?

问题描述

我在 Xodus 中有两个实体。一种叫做 SynsetID,它只有一个属性:synsetID。然后我有光泽度,它有一个叫做光泽度的属性。一个 SynsetID 可以链接到多个注释。我使用以下代码填充数据库:

        PersistentEntityStore store = PersistentEntityStores.newInstance("glosses-test");
        final StoreTransaction txn = store.beginTransaction(); 

        Entity synsetID;
        Entity gloss;
        String id;

        for (BabelSynset synset : synsetList){

            id = synset.getId().getID();

            System.out.println(id + " : ");

            List<BabelGloss> glosses = synset.getGlosses(chosenLang);

            synsetID = txn.newEntity("SynsetID");
            synsetID.setProperty("synsetID", id);


            String glossInLang;

            for (BabelGloss g : glosses){
                glossInLang = g.getGloss();
                gloss = txn.newEntity("Gloss");
                gloss.setProperty("gloss", glossInLang);

                gloss.addLink("synsetID", synsetID);
                synsetID.addLink("gloss", gloss);

                System.out.println(id + " : " + glossInLang);
            }

            txn.flush();
        }

        txn.commit();

但是当然,如​​果我想获得一个特定的 SynsetID,而不是直接以键值方式获得它,我必须搜索它:

    PersistentEntityStore store = PersistentEntityStores.newInstance("glosses-test");
    final StoreTransaction txn = store.beginReadonlyTransaction();

    Entity synsetID;
    Entity gloss;
    String id;

    for (BabelSynset synset : synsetList){

        id = synset.getId().getID();

        EntityIterable candidates = txn.find("SynsetID", "synsetID", id);

        if (!candidates.isEmpty()){
            System.out.println(id + ": ");
        }

        for (Entity s : candidates){
            for (Entity g : s.getLinks("gloss")){
                System.out.println(id + " : " + g.getProperty("gloss"));
            }
        }


    }

这不是非常低效吗?我可以做不同的事情吗?

标签: javaxodus

解决方案


你可以这样做:

for (Entity s: txn.getAll("SynsetID")) {
    Comparable id = s.getProperty("synsetID");
    for (Entity g : s.getLinks("gloss")) {
        System.out.println(id + " : " + g.getProperty("gloss"));
    }
}

此代码对 synsetID 属性的唯一性没有任何假设。我不认为它的性能会更好,但它看起来更简洁。您的代码没问题,特别是如果必须按 id 分组。


推荐阅读