【问题标题】:Exception in thread "main" com.hp.hpl.jena.update.UpdateException: Convert results are FAILED.:线程“main”com.hp.hpl.jena.update.UpdateException 中的异常:转换结果失败。:
【发布时间】: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 &lt;file:///path_to_your_file.ttl&gt; INTO GRAPH &lt;http://192.168.99.100/test1&gt;

标签: sparql rdf jena virtuoso turtle-rdf


【解决方案1】:

您的 Jena INSERT 失败了,因为 SPARQL 不允许您 INSERT {龟文件的完整内容} 当该内容包括 @base@prefix 和其他各种内容时。

对于您的基本问题,正如我之前在其他地方回答过的那样,有MANY documented ways to load data into Virtuoso

对于您在此处询问的具体情况,您可以使用 SPARQL LOAD 函数,如果您要加载的文件可以通过 HTTP 或其他方式访问Virtuoso 支持的 URI。 file: scheme URIs (as @AKSW shows) are supported if 该文件是 Virtuoso 实例的本地文件——即,如果它位于 Virtuoso 本地文件系统上,而不是任何远程客户端主机上——并且 if 包含目录包含在DirsAllowed setting of the [Parameters] stanza 的值中。

LOAD <file:///path_to_your_file.ttl> INTO GRAPH <http://192.168.99.100/test1>

我强烈建议您read the documentation。它确实回答了很多问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多