1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use std::path::PathBuf;

use crate::error::KGDataError;
use crate::models::kgns::KnowledgeGraphNamespace;
use crate::models::{Class, Entity, EntityMetadata, EntityOutLink, Property};

mod interface;
mod predefined_db;
mod readonly_rocksdb_dict;
pub mod remotedb;
pub use self::interface::Map;
pub use self::predefined_db::{
    deser_entity, deser_entity_metadata, open_class_db, open_entity_db, open_entity_metadata_db,
    open_entity_outlink_db, open_entity_pagerank_db, open_entity_redirection_db, open_property_db,
    PredefinedDB,
};
pub use self::readonly_rocksdb_dict::ReadonlyRocksDBDict;
pub use self::remotedb::{serve_db, RemoteRocksDBDict};

pub struct BaseKGDB<ED, EMD>
where
    ED: Map<String, Entity> + Sync + Send,
    EMD: Map<String, EntityMetadata> + Sync + Send,
{
    pub datadir: PathBuf,
    pub classes: ReadonlyRocksDBDict<String, Class>,
    pub props: ReadonlyRocksDBDict<String, Property>,
    pub entities: ED,
    pub entity_redirection: ReadonlyRocksDBDict<String, String>,
    pub entity_metadata: EMD,
    pub entity_outlink: ReadonlyRocksDBDict<String, EntityOutLink>,
    pub entity_pagerank: ReadonlyRocksDBDict<String, f64>,
    pub kgns: KnowledgeGraphNamespace,
}

pub type KGDB =
    BaseKGDB<ReadonlyRocksDBDict<String, Entity>, ReadonlyRocksDBDict<String, EntityMetadata>>;
pub type RemoteKGDB =
    BaseKGDB<RemoteRocksDBDict<String, Entity>, RemoteRocksDBDict<String, EntityMetadata>>;

impl KGDB {
    pub fn new(datadir: &str) -> Result<Self, KGDataError> {
        let datadir = PathBuf::from(datadir);
        Ok(Self {
            props: open_property_db(
                datadir
                    .join(PredefinedDB::Property.get_dbname())
                    .as_os_str(),
            )?,
            classes: open_class_db(datadir.join(PredefinedDB::Class.get_dbname()).as_os_str())?,
            entities: open_entity_db(datadir.join(PredefinedDB::Entity.get_dbname()).as_os_str())?,
            entity_redirection: open_entity_redirection_db(
                datadir
                    .join(PredefinedDB::EntityRedirection.get_dbname())
                    .as_os_str(),
            )?,
            entity_metadata: open_entity_metadata_db(
                datadir
                    .join(PredefinedDB::EntityMetadata.get_dbname())
                    .as_os_str(),
            )?,
            entity_outlink: open_entity_outlink_db(
                datadir
                    .join(PredefinedDB::EntityOutLink.get_dbname())
                    .as_os_str(),
            )?,
            entity_pagerank: open_entity_pagerank_db(
                datadir
                    .join(PredefinedDB::EntityPageRank.get_dbname())
                    .as_os_str(),
            )?,
            datadir,
            kgns: KnowledgeGraphNamespace::wikidata(),
        })
    }
}

impl RemoteKGDB {
    pub fn new<Q>(
        datadir: &str,
        entity_urls: &[Q],
        entity_metadata_urls: &[Q],
        entity_batch_size: usize,
        entity_metadata_batch_size: usize,
    ) -> Result<Self, KGDataError>
    where
        Q: AsRef<str>,
    {
        let datadir = PathBuf::from(datadir);
        Ok(Self {
            props: open_property_db(
                datadir
                    .join(PredefinedDB::Property.get_dbname())
                    .as_os_str(),
            )?,
            classes: open_class_db(datadir.join(PredefinedDB::Class.get_dbname()).as_os_str())?,
            entities: RemoteRocksDBDict::new(entity_urls, entity_batch_size, deser_entity)?,
            entity_redirection: open_entity_redirection_db(
                datadir
                    .join(PredefinedDB::EntityRedirection.get_dbname())
                    .as_os_str(),
            )?,
            entity_metadata: RemoteRocksDBDict::new(
                entity_metadata_urls,
                entity_metadata_batch_size,
                deser_entity_metadata,
            )?,
            entity_outlink: open_entity_outlink_db(
                datadir
                    .join(PredefinedDB::EntityOutLink.get_dbname())
                    .as_os_str(),
            )?,
            entity_pagerank: open_entity_pagerank_db(
                datadir
                    .join(PredefinedDB::EntityPageRank.get_dbname())
                    .as_os_str(),
            )?,
            datadir,
            kgns: KnowledgeGraphNamespace::wikidata(),
        })
    }
}