Есть ли способ «получить» свойство вместо «найти» его в Xodus? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть две сущности в Xodus. Один называется SynsetID, который имеет только одно свойство: synsetID. Тогда у меня есть 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();

Но, конечно, тогда, если я хочу получить конкретный c 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"));
            }
        }


    }

Разве это не очень неэффективно? Могу ли я сделать это по-другому?

1 Ответ

2 голосов
/ 13 февраля 2020

Вы можете сделать так:

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. Я не ожидаю, что его производительность будет лучше, но выглядит более лаконично. Ваш код в порядке, особенно если группировка по идентификатору обязательна.

...