2012-04-16 40 views
6

Tôi muốn sử dụng khả năng suy luận của Jena, nhưng tôi gặp một số vấn đề về hiệu năng khi tôi đang sử dụng InfModel.Jena: Cách suy ra các vấn đề về dữ liệu/hiệu suất

Dưới đây là một tổng quan về đơn giản hóa của ontology của tôi:

Thuộc tính:

hasX   (Ranges(intersection): X, inverse properties: isXOf) 
|-- hasSpecialX (Ranges(intersection): X, inverse properties: isSpecialXOf) 

isXOf   (Domains(intersection): X, inverse properties: hasX) 
|--isSpecialXOf (Domains(intersection): X, inverse properties: hasSpecialX) 

Bên cạnh đó có một lớp 'Object':

Object hasSpecialX some X 

Rõ ràng lưu trữ được dữ liệu sau:

SomeObject a Object 
SomeX a X 
SomeObject hasSpecialX SomeX 

Sử dụng truy vấn sau đây tôi muốn xác định loại cá thể nào thuộc về. Theo các giả định được thực hiện, chỉ nên trả lại 'SomeObject'.

SELECT ?x WHERE { ?x :hasX :SomeX . } 

Tuy nhiên, truy vấn với ds.getDefaultModel() không hoạt động vì dữ liệu không được lưu trữ rõ ràng. Khi tôi đang sử dụng infModel, mặt khác, truy vấn không bao giờ kết thúc. Lâu nhất tôi đã chờ 25 phút trước khi hủy bỏ. (Các triplestore có quy mô khoảng 180 MB)

Đây là mã của tôi:

OntModel ont = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF, null); 
ont.read("file:..." , "RDF/XML"); 

Reasoner reasoner = ReasonerRegistry.getOWLMicroReasoner(); 
reasoner = reasoner.bindSchema(ont); 

Dataset dataset = TDBFactory.createDataset(...); 
Model model = dataset.getDefaultModel(); 

InfModel infModel = ModelFactory.createInfModel(reasoner, model); 

QueryExecution qe = null; 
ResultSet rs; 

try { 
    String qry = "SELECT ?x WHERE { ?x :hasX :SomeX . }"; 
    qe = QueryExecutionFactory.create(qry, infModel); 
    rs = qe.execSelect(); 

    while(rs.hasNext()) { 
     QuerySolution sol = rs.nextSolution(); 
     System.out.println(sol.get("x")); 
    } 
} finally { 
    qe.close(); 
    infModel.close(); 
    model.close(); 
    dataset.close(); 
} 

Có gì không ổn với đoạn code trên, hoặc những gì khác có thể là lý do nó không hoạt động?

Bên cạnh đó, tôi muốn biết liệu tôi có thể tăng hiệu suất nếu tôi 'Xuất các tiên đề được suy ra dưới dạng bản thể luận' (như được cung cấp bởi Protege) không?

EDIT: tôi khi đó tôi đã cố gắng sử dụng Pellet, nhưng tôi vẫn không thể có được một mô hình suy ra, như tôi đã mô tả trong câu hỏi khác của tôi: OutOfMemoryError using Pellet as Reasoner. Tôi có thể làm gì khác?

Trả lời

3

Về hiệu suất, tốt hơn là thực hiện suy luận trước khi xác nhận dữ liệu và không thực hiện SPARQL với cơ chế suy luận Jena. Bạn đã sử dụng TDB, thành phần Jena phù hợp cho các tập dữ liệu lớn.

Nếu bằng cách sử dụng dữ liệu phỏng đoán trực tiếp, bạn không nhận được hiệu suất mong muốn thì tôi khuyên bạn nên chuyển sang cửa hàng ba có thể mở rộng hơn (4store hoặc Virtuoso).

+0

Cảm ơn câu trả lời của bạn! Tôi không chắc chắn làm thế nào để 'làm suy luận trước khi khẳng định dữ liệu' mặc dù. Bạn có thể giải thích làm thế nào để làm điều này? – Pedro

+0

Vì vậy, bạn có thể sử dụng bất kỳ lý do nào, Pellet chẳng hạn. –

+0

Tôi đoán tôi có thể truy cập mô hình suy luận bằng cách sử dụng 'infModel.getDeductionsModel()', nhưng phải mất một thời gian để tính toán và vấn đề hiệu suất gây ra bởi mã của tôi ở trên có thể là do suy luận nội bộ được áp dụng trên toàn bộ cơ sở dữ liệu. Nhưng khi bản thể luận của tôi vẫn đang thay đổi, tôi không muốn lưu trữ dữ liệu được suy ra trong cùng một TDB. Vậy thực hành tốt nhất trong trường hợp đó là gì? Dữ liệu phỏng đoán thường được lưu trữ trong một cửa hàng ba khác nhau? – Pedro

Các vấn đề liên quan