有没有办法在 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 分组。
我在 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 分组。