【发布时间】:2018-08-20 10:28:54
【问题描述】:
我正在使用 SPARQL 将三元组数据插入到 IRI 图中。
这是我的代码,
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.Iterator;
import com.hp.hpl.jena.graph.Graph;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import virtuoso.jena.driver.VirtGraph;
import virtuoso.jena.driver.VirtuosoQueryExecution;
import virtuoso.jena.driver.VirtuosoQueryExecutionFactory;
import virtuoso.jena.driver.VirtuosoUpdateFactory;
import virtuoso.jena.driver.VirtuosoUpdateRequest;
public class VirtuosoSPARQLExample9 {
/**
* Executes a SPARQL query against a virtuoso url and prints results.
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
String url;
if(args.length == 0)
url = "jdbc:virtuoso://192.168.99.100:1111";
else
url = args[0];
/* STEP 1 */
VirtGraph set = new VirtGraph (url, "dba", "dba");
/* STEP 2 */
String str = "CLEAR GRAPH <http://192.168.99.100/test1>";
VirtuosoUpdateRequest vur = VirtuosoUpdateFactory.create(str, set);
vur.exec();
// InputStream in = new FileInputStream("src/main/webapp/resources/outputfile/test.ttl");
// Model model1 = ModelFactory.createDefaultModel(); // creates an in-memory Jena Model
// model1.read(in, null, "TURTLE");
// StringWriter out = new StringWriter();
// model1.write(out, "TURTLE");
str = "INSERT INTO GRAPH <http://192.168.99.100/test1> { @base <http://example.org/> .\r\n" +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\r\n" +
"@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\r\n" +
"@prefix foaf: <http://xmlns.com/foaf/0.1/> .\r\n" +
"@prefix rel: <http://www.perceive.net/schemas/relationship/> .\r\n" +
"\r\n" +
"<#green-goblin>\r\n" +
" rel:enemyOf <#spiderman> ;\r\n" +
" a foaf:Person ; # in the context of the Marvel universe\r\n" +
" foaf:name \"Green Goblin\" .\r\n" +
"\r\n" +
"<#spiderman>\r\n" +
" rel:enemyOf <#green-goblin> ;\r\n" +
" a foaf:Person ;\r\n" +
" foaf:name \"Spiderman\", \"Человек-паук\"@ru . };";
vur = VirtuosoUpdateFactory.create(str, set);
vur.exec();
/* Select all data in virtuoso */
Query sparql = QueryFactory.create("SELECT * FROM <http://test1> WHERE { ?s ?p ?o }");
VirtuosoQueryExecution vqe = VirtuosoQueryExecutionFactory.create (sparql, set);
ResultSet results = vqe.execSelect();
System.out.println("\nSELECT results:");
while (results.hasNext()) {
QuerySolution rs = results.nextSolution();
RDFNode s = rs.get("s");
RDFNode p = rs.get("p");
RDFNode o = rs.get("o");
System.out.println(" { " + s + " " + p + " " + o + " . }");
}
sparql = QueryFactory.create("DESCRIBE <http://aa> FROM <http://test1>");
vqe = VirtuosoQueryExecutionFactory.create (sparql, set);
Model model = vqe.execDescribe();
Graph g = model.getGraph();
System.out.println("\nDESCRIBE results:");
for (Iterator i = g.find(Node.ANY, Node.ANY, Node.ANY); i.hasNext();)
{
Triple t = (Triple)i.next();
System.out.println(" { " + t.getSubject() + " " +
t.getPredicate() + " " +
t.getObject() + " . }");
}
sparql = QueryFactory.create("CONSTRUCT { ?x <http://test> ?y } FROM <http://test1> WHERE { ?x <http://bb> ?y }");
vqe = VirtuosoQueryExecutionFactory.create (sparql, set);
model = vqe.execConstruct();
g = model.getGraph();
System.out.println("\nCONSTRUCT results:");
for (Iterator i = g.find(Node.ANY, Node.ANY, Node.ANY); i.hasNext();)
{
Triple t = (Triple)i.next();
System.out.println(" { " + t.getSubject() + " " +
t.getPredicate() + " " +
t.getObject() + " . }");
}
sparql = QueryFactory.create("ASK FROM <http://test1> WHERE { <http://aa> <http://bb> ?y }");
vqe = VirtuosoQueryExecutionFactory.create (sparql, set);
boolean res = vqe.execAsk();
System.out.println("\nASK results: "+res);
}
}
运行查询时出现错误,
at virtuoso.jena.driver.VirtuosoUpdateRequest.exec(Unknown Source)
at com.bordercloud.sparql.virtuoso.VirtuosoSPARQLExample9.main(VirtuosoSPARQLExample9.java:70)
Caused by: virtuoso.jdbc3.VirtuosoException: SQ074: Line 16: SP030: SPARQL compiler, line 2: syntax error at '@base' before '<http://example.org/>'
at virtuoso.jdbc3.VirtuosoResultSet.process_result(Unknown Source)
at virtuoso.jdbc3.VirtuosoResultSet.<init>(Unknown Source)
at virtuoso.jdbc3.VirtuosoStatement.sendQuery(Unknown Source)
at virtuoso.jdbc3.VirtuosoStatement.execute(Unknown Source)
... 2 more
当我运行链接Viruoso Jena example 上给出的示例示例时,我正在使用 virtuoso Jena 示例,它将完美运行而没有错误。而我添加了我的rdf triples data 作为示例,其中包含前缀不会运行完美,我得到了错误。
另外,如果有任何方法可以使用 SPARQL 查询将 RDF 数据文件 (test.ttl) 直接加载到 virtuoso 服务器,请给我提示,这对我来说非常有用。
提前感谢您的帮助。
【问题讨论】:
-
请问您为什么将整个 Turtle 文件放入 SPARQL 1.1 更新请求的
INSERT部分? base 和 prefixes 声明属于查询,因此,必须在整个查询的开头。 -
com.hp.hpl.jena- Jena2,不是 Jena3。 -
嗨,@AKSW 感谢您的回复。因为我需要
INSERT根据要求将 Turtle 文件放入 virtuoso 服务器,所以我一直尝试使用 SPARQL 查询插入 Turtle 文件,但是还没有找到路,所以我先从 Turtle 文件中读取,然后尝试INSERT。如果这不可能,请告诉我。 -
@AKSW 或者说我想使用代码将 Turtle 文件上传到需要
INSERT的 virtuoso 服务器。正如我在问题链接 Viruoso Jena example 中提到的那样,有一种方法可以插入三元组。所以你能告诉我我该怎么做吗? -
LOAD <file:///path_to_your_file.ttl> INTO GRAPH <http://192.168.99.100/test1>
标签: sparql rdf jena virtuoso turtle-rdf