【问题标题】:Jena TDB insert statement resulting in empty fieldsJena TDB 插入语句导致空字段
【发布时间】:2012-10-03 19:08:07
【问题描述】:

我正在使用 Jena API 在 Jena TDB 中插入和更新三元组。我的设计是这样的,每个插入操作都在事务控制中。例如:

dataset.begin (ReadWrite.WRITE)
try
{
    // 1st insert operation
    dataset.commit()
} finally {
    dataset.end();
}

dataset.begin (ReadWrite.WRITE)
try
{
    // 2nd insert operation
    dataset.commit()
} finally {
    dataset.end();
}

之后,当我使用 READ 事务查询 TDB 时,我注意到一些条目(主语、谓语或宾语)是空的。为什么即使我没有使用嵌套事务,它也会以这种方式运行?

插入代码

    public class UpdateTDB2 {

    String directory = "C://myTDB//";
    Dataset dataset = TDBFactory.createDataset(directory);
    public static final String RDFPrefix = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>";
    public static final String XSDPrefix = "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>";
    public static final String MYPrefix = "PREFIX myprefix: <http://www.myexample.com/mySchema#>";

    public static void main(String[] args) {
        UpdateTDB2 obj = new UpdateTDB2();
        obj.createActionInstance();
        obj.createStateInstance();

    }

    public static void execUpdate(String sparqlUpdateString,
            GraphStore graphStore) {
        UpdateRequest request = UpdateFactory.create(sparqlUpdateString);
        UpdateProcessor proc = UpdateExecutionFactory.create(request,
                graphStore);
        proc.execute();
    }

    private void updateTriple(String sparqlUpdateString) {

        dataset.begin(ReadWrite.WRITE);
        try {
            GraphStore graphStore = GraphStoreFactory.create(dataset);
            execUpdate(sparqlUpdateString, graphStore);
            dataset.commit();

        } finally {
            dataset.end();
        }
    }

    private void createActionInstance() {

        String subject = new StringBuffer("myprefix:").append("LS_1_user")
                .toString();
        String predicate = "rdf:type";
        String object = "myprefix:Action";

        String insertString = createInsertString(subject, predicate, object);
        String sparqlInsertString = createSparqlString(insertString);
        updateTriple(sparqlInsertString);
    }

    private void createStateInstance() {

        String subject = new StringBuffer("myprefix:").append("LS_1_user_LicState")
                .toString();
        String predicate = "rdf:type";
        String object = "myprefix:State";

        String insertString = createInsertString(subject, predicate, object);
        String sparqlInsertString = createSparqlString(insertString);
        updateTriple(sparqlInsertString);
    }

    private String createInsertString(String subject, String predicate,
            String object) {
        String insertString = new StringBuffer("INSERT DATA { ")
                .append(subject).append(" ").append(predicate).append(" ")
                .append(object).append(" }").toString();

        return insertString;
    }

    private String createSparqlString(String str) {
        String sparqlString = StrUtils.strjoinNL(UpdateTDB2.XSDPrefix,
                UpdateTDB2.RDFPrefix, UpdateTDB2.MYPrefix, str);

        System.out.println(sparqlString);
        return sparqlString;
    }

}

查询代码

public class QueryTDB3 {

    public static void main(String[] args) {
        String directory = "C://myTDB//" ;
        Dataset dataset = TDBFactory.createDataset(directory) ;


        dataset.begin(ReadWrite.READ) ;
        try
        {
            // Do some queries
            String sparqlQueryString1 = "SELECT (count(*) AS ?count) { ?s ?p ?o }" ;


            String sparqlQueryString2 = "SELECT * { ?s ?p ?o }" ;
            execQuery(sparqlQueryString2, dataset) ;
            execQuery(sparqlQueryString1, dataset) ;
        } finally
        {
            dataset.end() ;
        }
    }

    public static void execQuery(String sparqlQueryString, Dataset dataset)
    {
        Query query = QueryFactory.create(sparqlQueryString) ;
        QueryExecution qexec = QueryExecutionFactory.create(query, dataset) ;
        try {
            ResultSet results = qexec.execSelect() ;

            ResultSetFormatter.out(results) ;

          } finally { qexec.close() ; }
    }

}

【问题讨论】:

  • 请出示告诉您条目是null的代码。通常,耶拿用户报告此问题时,实际上他们的意思是他们在资源上调用getURI(),并且返回null。这不是问题,它只是意味着您的数据中有空白节点 (bNodes)。
  • @IanDickinson ,我已经用一些示例代码更新了原始问题。有 2 个单独的类,一个执行插入,另一个查询 TDB。

标签: java rdf sparql jena tdb


【解决方案1】:

您正在运行哪个版本的代码?

如果您显示的代码(第一部分)确实在两个单独的运行中运行(因此有两个 JVM),那么这可能是由于 TDB 中的一个已知且已修复的错误。它只存在于相对较新的版本中。

请试用 Jena 2.7.4-SNAPSHOT 的开发版。

【讨论】:

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