2013-07-11 6 views
2

Я загружаю свои данные в модель TDB и написал несколько правил, используя Jena для применения в TDB. Затем я храню выводимые данные в новую БТ.Jena Rule Engine с TDB

Я применил корпус выше в небольшом наборе данных ~ 200 кбайт и сформулировал только штраф. ОДНАКО, мой фактический TDB равен 2.7G, и компьютер работает около недели, и он на самом деле все еще работает.

Это что-то нормальное, или я делаю что-то неправильно? Какова альтернатива движку правил Йены?

Вот небольшой кусок кода:

public class Ruleset { 
    private List<Rule> rules = null; 
    private GenericRuleReasoner reasoner = null; 

    public Ruleset (String rulesSource){ 
    this.rules = Rule.rulesFromURL(rulesSource); 
    this.reasoner = new GenericRuleReasoner(rules); 
    reasoner.setOWLTranslation(true);   
    reasoner.setTransitiveClosureCaching(true); 
    } 

    public InfModel applyto(Model mode){ 
    return ModelFactory.createInfModel(reasoner, mode); 
    } 

    public static void main(String[] args) { 
    System.out.println(" ... Running the Rule Engine ..."); 
    String rulepath = "src/schemaRules.osr"; 
    Ruleset rule = new Ruleset (rulepath); 
    InfModel infedModel = rule.applyto(data.tdb); 
    infdata.close(); 
    } 
} 
+1

Это также [вывешены] (http://mail-archives.apache.org/mod_mbox/jena-users/201307.mbox/%3CCAMwKOMrL2ezx-KeN-eQcY9TtEJ_e%2BTNnLYPZ29B-69Ynq%3D%3DHMw%40mail.gmail.com% 3E) в список рассылки пользователей Jena и полученные ответы [от Dave Reynolds] (http://mail-archives.apache.org/mod_mbox/jena-users/201307.mbox/%[email protected] .com% 3E) и [от Энди Сиборна] (http://mail-archives.apache.org/mod_mbox/jena-users/201307.mbox/%[email protected]%3E). –

ответ

2

Большой набор данных в постоянном хранилище не хороший матч с системой правил Jena в. Основная проблема заключается в том, что RETE engine сделает множество небольших запросов на графике во время распространения правила. Накладные расходы при создании этих запросов в любом постоянном хранилище, включая TDB, как правило, делают время выполнения недопустимо длинным, как вы уже нашли.

В зависимости от ваших целей для использования умозаключения, вы можете иметь несколько вариантов:

  • Загрузите данные в достаточно большом график памяти, а затем сохранить закрытие логического вывода (базовый график плюс entailments) к TDB хранится в одной транзакции. После этого вы можете запросить хранилище, не налагая накладные расходы на систему правил. Очевидно, что обновления могут быть проблемой при таком подходе.

  • Имейте данные в TDB, как сейчас, но динамически загружайте подмножество в модель памяти для использования в реальном времени с помощью вывода. Делает обновления проще (пока вы обновляете как копию памяти, так и постоянное хранилище), но требует разделения ваших данных.

Если вы хотите только некоторые основные выводы, такие как закрытие rdfs:subClassOf иерархии, вы можете использовать инструмент infer командной строки для создания закрытия логического вывода, который вы можете загрузить в БРТ:

$ infer -h 
infer --rdfs=vocab FILE ... 
General 
    -v --verbose   Verbose 
    -q --quiet   Run with minimal output 
    --debug    Output information for debugging 
    --help 
    --version    Version information 

Infer может быть более эффективным, поскольку для него не требуется большая модель памяти. Однако он ограничивается в выводах, которые он будет вычислять.

Если ни один из них не работает для вас, вы можете рассмотреть коммерческие двигатели вывода, такие как OWLIM или Stardog.

0

Спасибо Яну.

Я действительно мог сделать это с помощью обновления SPARQL, поскольку DAVE советует мне, и это заняло всего 10 минут, чтобы закончить работу.

Вот пример кода:

System.out.println(" ... Load rules ..."); 
    data.startQuery(); 
    String query = data.loadQuery("src/sparqlUpdatesRules.tql"); 
    data.endQuery(); 

    System.out.println(" ... Inserting rules ..."); 
    UpdateAction.parseExecute(query, inferredData.tdb); 

    System.out.println(" ... Printing RDF ..."); 
    inferredData.exportRDF(); 

    System.out.println(" ... closeing ..."); 
    inferredData.close(); 

и вот пример обновления SPARQL:

INSERT { 
    ?w ddids:carries ?p . 
} WHERE { 
    ?p ddids:is_in ?w . 
}; 

спасибо за ваши ответы

 Смежные вопросы

  • Нет связанных вопросов^_^