【问题标题】:Develop a web application based on triplestore database开发基于triplestore数据库的web应用
【发布时间】:2016-07-15 09:03:45
【问题描述】:


我最近使用 Java EE 开发了一个“经典”的 3 层 Web 应用程序。
我将 GlassFish 用作应用程序服务器,将 MS SQL Server 用作 DBMS,并将带有 primefaces 组件的 xhtml 页面用作前端。

现在,出于教育目的,我想用纯三元存储数据库替换关系数据库,但我不确定要遵循的过程。

我在谷歌和这个网站上搜索了很多,但我没有找到我要找的东西,因为我找到的每个答案都比实际更理论。
如果可能的话,我需要一些教程或一些实用技巧。 我已阅读有关 Apache Jena 的文档,但找不到可靠的起点。
特别是:
- 为了将 MS SQL Server 与 GlassFish 一起使用,我使用了 JDBC 驱动程序,创建了一个数据源和一个连接池。是否存在建立三重存储数据库的等效程序?
- 为了处理用户身份验证,我使用了 Realm。我现在该怎么办?

目前我已经“手动”创建了一个 RDF 模式,并使用 Jena Schemagen 将它翻译成一个 Java 类。我现在该怎么办?

【问题讨论】:

  • 欢迎来到stackoverflow。请花点时间关注tour,了解您可以和不能在这里提出的问题。您的问题是题外话,因为它要求场外资源,并且删除它过于广泛。
  • 我已经阅读了欢迎指南,我认为我的问题不是基于意见的,它与实际问题有关,并且在此站点中没有解决方案。
  • @Gimby 很有礼貌。展示你做了什么;显示缺少的内容;展示你试图做的事情没有奏效;询问有关如何使丢失的位起作用的具体问题。

标签: java rdf jena rdfs triplestore


【解决方案1】:

经过多次尝试和网上的其他研究,我终于实现了我的目标。
我决定开发一个混合解决方案,在其中我通过 MS SQL Server 和 JDBCRealm 管理用户登录和他们的导航许可,同时我使用Jena TDB 来保存所有其他数据。

从 RDF 模式开始,我创建了一个包含资源和属性的 Java 类,以便通过代码轻松创建我的语句。这是一个例子:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns="http://www.stackoverflow.com/example#"
    xml:base="http://www.stackoverflow.com/example">


    <rdfs:Class rdf:ID="User"></rdfs:Class>

    <rdfs:Class rdf:ID="Project"></rdfs:Class>

    <rdf:Property rdf:ID="email"></rdf:Property>

    <rdf:Property rdf:ID="name"></rdf:Property>

    <rdf:Property rdf:ID="surname"></rdf:Property>

    <rdf:Property rdf:ID="description"></rdf:Property>

    <rdf:Property rdf:ID="customer"></rdf:Property>

    <rdf:Property rdf:ID="insertProject">
        <rdfs:domain rdf:resource="http://www.stackoverflow.com/example#User"/>
        <rdfs:range rdf:resource="http://www.stackoverflow.com/example#Project"/>
    </rdf:Property>

</rdf:RDF>

这是 Java 类:

public class MY_ONTOLOGY {

    private static final OntModel M = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM);

    private static final String NS = "http://www.stackoverflow.com/example#";

    private static final String BASE_URI = "http://www.stackoverflow.com/example/";

    public static final OntClass USER = M.createClass(NS + "User");

    public static final OntClass PROJECT = M.createClass(NS + "Project");

    public static final OntProperty EMAIL = M.createOntProperty(NS + "hasEmail");

    public static final OntProperty NAME = M.createOntProperty(NS + "hasName");

    public static final OntProperty SURNAME = M.createOntProperty(NS + "hasSurname");

    public static final OntProperty DESCRIPTION = M.createOntProperty(NS + "hasDescription");

    public static final OntProperty CUSTOMER = M.createOntProperty(NS + "hasCustomer");

    public static final OntProperty INSERTS_PROJECT = M.createOntProperty(NS + "insertsProject");

    public static final String getBaseURI() {
        return BASE_URI;
    }

}

然后我在我的 PC 上创建了一个目录来存储数据,例如 C:\MyTDBdataset
为了在其中存储数据,我使用以下代码:

String directory = "C:\\MyTDBdataset";
Dataset dataset = TDBFactory.createDataset(directory);


dataset.begin(ReadWrite.WRITE);
try {
    Model m = dataset.getDefaultModel();
    Resource user = m.createResource(MY_ONTOLOGY.getBaseURI() + "Ronnie", MY_ONTOLOGY.USER);
    user.addProperty(MY_ONTOLOGY.NAME, "Ronald");
    user.addProperty(MY_ONTOLOGY.SURNNAME, "Red");
    user.addProperty(MY_ONTOLOGY.EMAIL, "ronnie@myemail.com");  

    Resource project = m.createResource(MY_ONTOLOGY.getBaseURI() + "MyProject", MY_ONTOLOGY.PROJECT);
    project.addProperty(MY_ONTOLOGY.DESCRIPTION, "This project is fantastic");
    project.addProperty(MY_ONTOLOGY.CUSTOMER, "Customer & Co");

    m.add(user, MY_ONTOLOGY.INSERTS_PROJECT, project);
    dataset.commit();
} finally {
    dataset.end();
}

如果我想读取我的 TDB 中的语句,我可以使用这样的东西:

dataset.begin(ReadWrite.READ);

try {
    Model m = dataset.getDefaultModel();
    StmtIterator iter = m.listStatements();


    while (iter.hasNext()) {
        Statement stmt = iter.nextStatement();
        Resource subject = stmt.getSubject();
        Property predicate = stmt.getPredicate();
        RDFNode object = stmt.getObject();


        System.out.println(subject);
        System.out.println("\t" + predicate);
        System.out.println("\t\t" + object);
        System.out.println("");
   }
    m.write(System.out, "RDF/XML"); //IF YOU WANT TO SEE AT CONSOLE YOUR DATA AS RDF/XML
} finally {
    dataset.end();
}

如果您想以不同方式导航模型,请查看 Apache 提供的 tutorial
如果要删除模型中的特定语句,可以编写如下内容:

dataset.begin(ReadWrite.WRITE);
try {
    Model m = dataset.getDefaultModel();
    m.remove(m.createResource("http://http://www.stackoverflow.com/example/Ronnie"), MY_ONTOLOGY.NAME, m.createLiteral("Ronald"));
    dataset.commit();
} finally {
    dataset.end();
}

就是这样!再见!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多