【发布时间】:2017-11-16 08:45:27
【问题描述】:
我只需要在 Jena 中加载一次本体。我的包含 SPARQL 查询的方法也包含
Model model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
model = FileManager.get().loadModel("c:/jena/ICD.owl");
除了每次进行查询时,该方法都会重新加载本体,这一切都很好。 我需要只加载一次本体,并在方法中“看到”“模型”变量。如果我将两个模型语句移到主类中,则该方法看不到“模型”。 Java 中没有全局变量。
代码如下:
class store {
Model model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
public void myQuery() {
String pattern = "\\#(.*)$";
model = FileManager.get().loadModel("c:/jena/ICD.owl");
String singleQueryWord1="VEnTRICULAR FIBRILLATION";
String firstQueryWord2="pedestrian";
String secondQueryWord2="car";
String queryPattern1="("+singleQueryWord1+"(.*))";
String queryPattern2="("+firstQueryWord2+"(.|\\n)*"+secondQueryWord2+")|("+secondQueryWord2+"(.|\\n)*"+firstQueryWord2+")";
Pattern r = Pattern.compile(pattern);
String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\r\n" +
"PREFIX afn:<http://jena.apache.org/ARQ/function#>\r\n"+
"PREFIX owl: <http://www.w3.org/2002/07/owl#>\r\n" +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\r\n" +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\r\n" +
"PREFIX dc: <http://purl.org/dc/elements/1.1/>\r\n" +
"SELECT DISTINCT ?subject ?object\r\n" +
" WHERE {\r\n"+
"?subject dc:title ?object \r\n" +
"FILTER regex(?object,\""+ queryPattern1 +"\",\"i\")\r\n" +
//"FILTER regex( ?object,\"( pedestrian (.|\\n)* car )|( car (.|\\n)* pedestrian )\",\"i\")\r\n"+
"}"
;
Query query = QueryFactory.create(queryString) ;
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
ResultSet results = qexec.execSelect() ;
if(!results.hasNext()) {
System.out.println("No results");
}else
for ( ; results.hasNext() ; )
{
QuerySolution soln = results.nextSolution();
Resource subj = (Resource) soln.get("?subject");
String subStr = subj.toString();
Matcher m = r.matcher(subStr);
if(m.find()) {
Literal obj = (Literal) soln.get("?object");
System.out.println(m.group()+" ........ "+obj);
}
m.reset();
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
非常感谢您的任何建议。 菲尔
【问题讨论】:
-
在构造函数中加载本体不起作用,为什么?请显示执行查询的方法!
-
"Java 中没有全局变量" -> 什么?
-
感谢 ASKW 的回复。根据 David Flannigan 的说法,在“简而言之 java”中,没有全局变量。 Instread,变量在类中声明并构成该类的一部分。我试图将构造函数放在 Main 类中。但是,我想我可能已经通过声明一个名为“store”的新类并将方法“my query”放入其中来解决它。这只是一点学习的乐趣。这是代码:
-
我已将代码放入上面的原始问题中。
-
你之前是怎么调用这个方法的?我的意思是,在 Java 中你有类和对象,它们都可以有变量。