有没有办法在 Xodus 中 "get" 一个 属性 而不是 "finding" 呢?

Is there a way to "get" a property instead of "finding" it in Xodus?

我在 Xodus 中有两个实体。一种称为 SynsetID,它只有一个 属性:synsetID。然后我有 Gloss,它有一个 属性 叫做 gloss。一个 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"));
            }
        }


    }

这不是很低效吗?我可以做不同的事吗?

你可以这样做:

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 分组。