Java 与命令行相比,在Eclipse中SPARQL查询需要更长的时间
我需要比较SPARQL和SQL(基于Oracle)。 所以我从Jena和Eclipse开始。我在SPARQL中创建了我的RDF文件和查询,但是当我在命令行中执行查询时,需要5秒钟才能得到结果,而在Eclipse中则需要15秒钟! 两个计算时间之间的差异很大,我无法正确比较这些数据库 有人知道为什么吗 我以RDF/XML模式保存RDF文件(默认情况下) 谢谢 我使用的代码如下:Java 与命令行相比,在Eclipse中SPARQL查询需要更长的时间,java,eclipse,rdf,sparql,jena,Java,Eclipse,Rdf,Sparql,Jena,我需要比较SPARQL和SQL(基于Oracle)。 所以我从Jena和Eclipse开始。我在SPARQL中创建了我的RDF文件和查询,但是当我在命令行中执行查询时,需要5秒钟才能得到结果,而在Eclipse中则需要15秒钟! 两个计算时间之间的差异很大,我无法正确比较这些数据库 有人知道为什么吗 我以RDF/XML模式保存RDF文件(默认情况下) 谢谢 我使用的代码如下: String q = "SELECT ?appID ?appLibelle ?droit ?login ?passwor
String q = "SELECT ?appID ?appLibelle ?droit ?login ?password ?prenom ?nom "
+ "WHERE { "
+ "?empdroitapp EMPDROITAPP:EMP_ID ?emp . "
+ "?empdroitapp EMPDROITAPP:APP_ID ?app . "
+ "?empdroitapp EMPDROITAPP:EMPDroitAPP_Droit ?droit . "
+ "OPTIONAL { ?empapp EMPAPP:EMP_ID ?emp . "
+ "?empapp EMPAPP:APP_ID ?app . "
+ "?empapp EMPAPP:EMPAPP_Login ?login . "
+ "?empapp EMPAPP:EMPAPP_Password ?password . } . "
+ "?emp EMP:EMP_ID ?empID . "
+ "?emp EMP:EMP_Prenom ?prenom . "
+ "?emp EMP:EMP_Nom ?nom . "
+ "?app APP:APP_ID ?appID . "
+ "?app APP:APP_Libelle ?appLibelle . "
+ "} ORDER BY ASC(?empID)";
String prefix = "PREFIX LDAP: <http://example.com/property#>";
String prefixEMP = "PREFIX EMP: <http://example.com/property/emp#>";
String prefixAPP = "PREFIX APP: <http://example.com/property/app#>";
String prefixEMPAPP = "PREFIX EMPAPP: <http://example.com/property/empapp#>";
String prefixEMPDROITAPP = "PREFIX EMPDROITAPP: <http://example.com/property/empdroitapp#>";
String queryString = prefix + NL + prefixEMP + NL + prefixAPP + NL
+ prefixEMPAPP + NL + prefixEMPDROITAPP + q;
Query query = QueryFactory.create(queryString);
//query.serialize(new IndentedWriter(System.out, false));
QueryExecution qexec = QueryExecutionFactory.create(query, m);
long chrono = java.lang.System.currentTimeMillis();
try {
// Assumption: it's a SELECT query.
ResultSet rs = qexec.execSelect();
//String str = "appID\tappLibelle\tdroit\tlogin\tpassword\tprenom\tnom\n";
// The order of results is undefined.
for (; rs.hasNext();) {
QuerySolution rb = rs.nextSolution();
// Get title - variable names do not include the '?' (or '$')
RDFNode appID = rb.get("appID");
RDFNode appLibelle = rb.get("appLibelle");
RDFNode droit = rb.get("droit");
RDFNode login = rb.get("login");
RDFNode password = rb.get("password");
RDFNode prenom = rb.get("prenom");
RDFNode nom = rb.get("nom");
// Check the type of the result value
if (appID.isResource()) {
Resource res = (Resource) appID;
System.out.print("\t" + res);
} else {
System.out.print("\t" + appID);
}
if (appLibelle != null) {
System.out.print("\t" + appLibelle);
} else System.out.print("\tnull");
if (droit != null) {
System.out.print("\t" + droit);
} else System.out.print("\tnull");
if (login != null) {
System.out.print("\t" + login);
} else System.out.print("\tnull");
if (password != null) {
System.out.print("\t" + password);
} else System.out.print("\tnull");
if (prenom != null) {
System.out.print("\t" + prenom);
} else System.out.print("\tnull");
if (nom != null) {
System.out.print("\t" + nom);
} else System.out.print("\tnull");
System.out.println();
//str += "\n";
}
//System.out.println(str);
} finally {
// QueryExecution objects should be closed to free any system
// resources
qexec.close();
}
long tmp = java.lang.System.currentTimeMillis();
System.out.println("Temps écoulé : " + (tmp - chrono) + "ms");
String q=“选择?应用ID?应用贝尔?所有权?登录?密码?prenom?nom”
+“其中{”
+“?empdroitapp empdroitapp:EMP_ID?EMP。”
+“?empdroitapp empdroitapp:APP_ID?APP”
+“?empdroitapp empdroitapp:empdroitapp_Droit?Droit。”
+“可选{?empapp empapp:EMP_ID?EMP。”
+“?empapp empapp:APP_ID?APP”
+“?empapp empapp:empapp\u登录?登录。”
+“?empapp empapp:empapp_密码?密码。}”
+“emp emp:emp_ID?empID”
+“emp emp:emp_Prenom?Prenom”
+“emp emp:emp_Nom?Nom”
+“应用程序:应用程序ID?应用程序ID”
+“应用程序应用程序:应用程序库?应用程序库。”
+“}ASC命令(?empID)”;
字符串前缀=“前缀LDAP:”;
字符串prefixEMP=“PREFIX EMP:”;
字符串prefixAPP=“PREFIX APP:”;
字符串prefixEMPAPP=“PREFIX emapp:”;
字符串prefixEMPDROITAPP=“PREFIX EMPDROITAPP:”;
字符串queryString=prefix+NL+prefixEMP+NL+prefixAPP+NL
+prefixEMPAPP+NL+prefixEMPDROITAPP+q;
Query=QueryFactory.create(queryString);
//序列化(新缩进写入程序(System.out,false));
QueryExecution qexec=QueryExecutionFactory.create(query,m);
long chrono=java.lang.System.currentTimeMillis();
试一试{
//假设:这是一个SELECT查询。
ResultSet rs=qexec.execSelect();
//String str=“appID\tappLibelle\tdroit\tlogin\tpassword\tprenom\tnom\n”;
//结果的顺序未定义。
对于(;rs.hasNext();){
QuerySolution rb=rs.nextSolution();
//获取标题-变量名不包括“?”(或“$”)
RDFNode appID=rb.get(“appID”);
RDFNode appLibelle=rb.get(“appLibelle”);
RDFNode droit=rb.get(“droit”);
RDFNode login=rb.get(“login”);
RDFNode password=rb.get(“密码”);
RDFNode prenom=rb.get(“prenom”);
RDFNode nom=rb.get(“nom”);
//检查结果值的类型
if(appID.isResource()){
资源res=(资源)appID;
系统输出打印(“\t”+res);
}否则{
系统输出打印(“\t”+appID);
}
if(appLibelle!=null){
系统输出打印(“\t”+appLibelle);
}else系统输出打印(“\t完整”);
if(droit!=null){
系统输出打印(“\t”+droit);
}else系统输出打印(“\t完整”);
如果(登录名!=null){
系统输出打印(“\t”+登录);
}else系统输出打印(“\t完整”);
if(密码!=null){
系统输出打印(“\t”+密码);
}else系统输出打印(“\t完整”);
如果(prenom!=null){
系统输出打印(“\t”+prenom);
}else系统输出打印(“\t完整”);
如果(nom!=null){
系统输出打印(“\t”+nom);
}else系统输出打印(“\t完整”);
System.out.println();
//str+=“\n”;
}
//系统输出打印项次(str);
}最后{
//QueryExecution对象应关闭以释放任何系统
//资源
qexec.close();
}
long tmp=java.lang.System.currentTimeMillis();
System.out.println(“Tempsécoulé:”+(tmp-chrono)+“ms”);
代码中没有明显的错误,但运行时性能当然不仅取决于代码,还取决于数据的大小和形状、如何将数据添加到存储/模型、JRE的可用内存量等等。换言之,这有点过于宽泛,以其当前的形式无法回答。作为一般观点,我还想说,如果您比较SPARQL和SQL,我个人的观点是,您不应该真正关注一个特定SPARQL实现(Jena)与一个特定SQL实现(Oracle)的性能,而是关注表现力、适用性等,这是我首先在Eclipse上运行的数据文件和查询,另一方面是通过命令行运行的数据文件和查询。这也是运行一切的同一台计算机。我和Jena一起添加数据,如果你愿意,我可以编辑我的第一篇文章,把它放进去。我的JRE内存在Eclipse和shell之间没有变化。为了回答你的第二篇文章,我必须将使用jena的SPARQL与单个关系数据库进行比较,所以我选择Oracle。。这并不是我的全部选择一个更一般的评论:一般来说,数据库通常需要“预热”它们的索引,然后才能变得性能良好。只运行一次查询可能会得到不正确的结果。尝试在一行中运行查询十次(使用一个简单的for
-循环或其他方法)并平均响应时间。运行Eclipse与在Eclipse中运行您自己的代码不同。确保您正在配置自己的程序以使用足够的RAM。见例。