当前位置: 首页 > 知识库问答 >
问题:

向Jena RDF三元组添加年龄(整数文字),并使用SPARQL查询它们

吕华彩
2023-03-14

我正在尝试学习使用Jena和RDF三元组的基础知识。同样使用Oracle数据库,所以按照他们的指导,我有一些示例程序在运行,例如Example7-18 SPARQL可选查询。这个例子像写的那样工作得很好。它允许匹配查询,如

where {?s <u:parentOf> ?o}

where {<u:John> <u:parentOf> <u:Mary>}
A . B . FILTER ( …expr… )

where {?s <u:parentOf> ?o . ?o <u:isAge> ?a . filter ( ?a < 20 ) }

使用当前的三元组代码,我只能添加字符串/URI节点,尽管我可以生成一个三元组,例如 ,但我无法筛选和比较该年龄的<运算符,因此它不是很有用。

我已经四处寻找了一段时间,我怀疑这样做是非常简单的,但代码样本一直很难找到。

共有1个答案

相俊迈
2023-03-14

请注意,您需要一个类似“35”^^xsd:int“35^^xsd:integer这样的对象,它们是文字,而不是 这样的URI(可能格式不正确)。在我看来,这个示例的操作方式有些不同寻常,而且根据文档,它使用了一些不推荐使用的方法。无论如何,您可以看到它使用Node类(工厂类)中的方法创建URI节点:

Node.createURI("u:John")
Node.createURI("u:parentOf")
Node.createURI("u:Mary")

Node类中有五个createLiteral方法,您可以使用createLiteral(String lex,RDFDatatype dtype)创建具有DataType的literal。但是不推荐使用该方法,您确实应该使用NodeFactory中的方法之一。

话虽如此,但我不知道这个示例使用图形接口而不是模型接口来创建三元组是否有任何原因。您已经从以下位置获得了模型:

ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName);

如果使用Model接口,则该任务要容易得多,其中有createTypedLiteral这样的方法,您可以简单地调用createTypedLiteral(30)并返回一个合适的文字。这里有一个例子:

import java.math.BigInteger;

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;

public class CreateAndQueryExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // You should be able to replace this with the Oracle model 
        // producing code.
        Model model = ModelFactory.createDefaultModel();

        Resource john = model.createResource( "urn:ex:John" );
        Resource mary = model.createResource( "urn:ex:Mary" );
        Property age = model.createProperty( "urn:ex:age" );

        // Using Model.add method
        model.add( john, age, model.createTypedLiteral( new BigInteger( "25" )));  // "25"^^xsd:integer
        // model.add( john, age, model.createTypedLiteral( 25 ));                  // "25"^^xsd:int
        // model.add( john, age, model.createTypedLiteral( 25l ));                 // "25"^^xsd:long

        // Using the Resource.addProperty method
        mary.addProperty( age, model.createTypedLiteral( new BigInteger( "35" )));

        Query query = QueryFactory.create( "select * where { ?s <urn:ex:age> ?age . filter ( ?age < 30 ) }" );
        QueryExecution exec = QueryExecutionFactory.create( query, model );
        ResultSetFormatter.out( exec.execSelect() );
    }
}
-----------------------
| s             | age |
=======================
| <urn:ex:John> | 25  |
-----------------------
 类似资料:
  • 每月,我想从我的一个集合中删除所有超过1个月的文档。集合中的示例文档如下所示: 我希望自动安排此任务的执行,这样它就不需要人工输入(例如,作为cron作业),因此我希望它具有尽可能少的逻辑。 如何查询createDate早于1个月的文档?我曾想过尝试这样的事情: 。。。其中,我创建了一个当前时间减去1个月毫秒的新ISODate,但它不会返回任何数据。这也有点难看,即使它确实有用。我将如何实现这一点

  • 我对meta_query有些情境问题。客户搜索四,但结果包括私人(原始词是私人的)。我想只显示IV(罗马数字)包括后。我的meta_query搜索从标题,子标题和自定义插件的描述。我找到了REGEXP,但我找不到从标题、子标题和描述中找到漫游数字的正确方法。 客户只能找到罗马数字,也可以找到任何单词等。

  • 问题内容: 我想从Oracle表的DOB(出生日期)字段中计算当前的人的年龄。 DOB字段的数据类型为varchar,其日期以“ DD-MON-YY”格式存储。 当我从日期算起一个人的当前年龄时,查询将返回负数。另外,我观察到,如果日期为13到49年,则结果为负。 例子 查询执行以供参考 任何帮助表示赞赏! 问题答案: 为了解决21世纪的问题,只需稍微修改@the_silk的答案即可: 请注意,尽

  • 问题内容: 我有一个多维数组$ md_array,我想将更多元素添加到子数组recipe_type和美食中,这些美食来自从表中读取数据的循环。 在循环中,我为每行创建一个新表$ newdata: 然后,我需要将$ newdata数组追加到以下多维数组: 使用array_push将新元素(数组)添加到recipe_type数组的语法是什么?我永远无法绕过多维数组,我有点困惑。 问题答案: 如果要在关

  • 我正在尝试使用rdf4j文档构造SPARQL查询:https://rdf4j.org/documentation/tutorials/sparqlbuilder/ 我是java的新手(和stackoverflow,如果写得不好,很抱歉),但我想我已经包含了正确的开始步骤。我用以下方式实例化了一个选择查询、前缀和变量: URL已被右前缀替换 我试图编写的查询是:选择?在哪里{:team_1:draf