gpt4 book ai didi

java - 开发基于 Triplestore 数据库的 Web 应用程序

转载 作者:行者123 更新时间:2023-11-30 02:51:54 25 4
gpt4 key购买 nike


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

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

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

目前,我已经“手动”创建了一个 RDF 模式,并使用 Jena Schemagen 将其转换为 Java 类。我现在应该做什么?

最佳答案

经过多次尝试和网上的其他研究,我终于实现了我的目标。
我决定开发一个混合解决方案,在其中通过 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();
}

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

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();
}

仅此而已!再见!

关于java - 开发基于 Triplestore 数据库的 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com