Я пытаюсь создать базу данных из dbpedia RDF троек. У меня есть таблица Categories
, которая содержит все Категории в Википедии. Чтобы сохранить категоризации, я создал таблицу с полями child
и parent
, оба внешних ключа в таблице Categories
. Чтобы загрузить категории из NTriples iam, используя следующий SQL-запрос
INSERT INTO CatToCat (`child`, `parent`)
values((SELECT id FROM Categories WHERE BINARY identifier='Bar'),
(SELECT id FROM Categories WHERE BINARY identifier='Bar'));
Но вставка очень медленная.. Вставка 2.5Million отношений займет очень много времени.. есть ли лучший способ оптимизировать запрос, схему
Я решил проблему. Были некоторые проблемы с индексацией. Сделал идентификатор в категориях уникальным и двоичным. Думаю, это ускорило два выбора.
вы можете попробовать базу данных графиков, такую как Neo4j, с верхними слоями RDF, например, реализация Tinkerpop SAIL, см. https://github.com/tinkerpop/blueprints/wiki/Sail-Implementation
Это должно работать немного лучше, чем RDBMS, по крайней мере для Neo4j.
/питер
Рассмотрим загрузку SELECT id, indentifier from Categories
в хеш-таблицу (или trie) на стороне клиента и используя ее для заполнения CatToCat. В базе данных размер википедии, я ожидаю увидеть огромную разницу в производительности между постоянными хэш-поисками и trie lookups (которые являются постоянными по отношению к количеству разных элементов данных) и log n
B-Tree lookups. (Конечно, вам нужно иметь доступную память.)
Рассмотрите возможность использования одного PreparedStatement с привязкой к параметрам, чтобы MySQL не нуждался в повторном анализе и повторной оптимизации запроса для каждой вставки.
Вам нужно будет сравнить эти показатели, чтобы выяснить, насколько они на самом деле улучшены.