使用 java api 在 marklogic 中创建三元组
Creating triples in marklogic using the java api
我们正在开发一个使用 Marklogic 作为实体文档存储的应用程序。我们计划使用语义建立实体之间的关系。
例如:Company 是一个实体,"ABC Corporation" 是 Company 实体的一个实例。同样,Truck 是一个实体,"Volvo 101" 是 Truck 实体的一个实例。
当用户在 UI.
中创建业务实体实例时,我们打算通过如下创建三元组来定义这些关系
然而,当我们使用 GraphManager.merge() 时,我们会遇到问题,因为每次主语、谓语和宾语相同时,此方法都会向图中添加新的三元组。现有的三元组不会被覆盖。
我们也尝试了 write/writeAs 方法,仍然看到相同的行为。
我们还查看了 Marklogic 提供的 sesame 和 jena api,但找不到好的文档。如果我们打算进行大量语义操作并动态构建三元组,哪个 api 更适合用于语义? Marklogic-java-api or sesame or jena?
代码片段:
String subjectURI = "http://example.org/entityinstance/ABCCorporation";
String predicateURI = "http://example.org/relation/instanceof";
String objectURI = "http://example.org/entity/company";
String graphURI = "http://example.org/graph/Relation";
public void createTriple(String subjectURI, String predicateURI,
String objectURI, String graphURI)
{
DatabaseClient client = markLogicConnectionHelper.getMLConnection();
String tripleStore = "<" + subjectURI + ">" + " " + " <" + predicateURI
+ ">" + " " + "<" + objectURI + ">" + ".";
GraphManager graphManager = client.newGraphManager();
graphManager.setDefaultMimetype(RDFMimeTypes.NTRIPLES);
graphManager.merge(graphURI, new StringHandle(tripleStore));
}
如果您想构建三元组,您将需要为 Java 使用 RDF API。 jena 和 sesame 就是两个这样的 API。芝麻已经变成了rdf4j。
那些 API 都提供了创建和操作三元组和图形的好方法。
如果你使用 marklogic-jena,你可以使用 Jena 的持久化机制将这些图存储在 MarkLogic 中。
DatabaseClient client = DatabaseClientFactory.newClient(...);
JenaDatabaseClient c = new JenaDatabaseClient(client);
MarkLogicDatasetGraph dsg = new MarkLogicDatasetGraph(c);
dsg.add(NodeFactory.createURI("http://..."),
NodeFactory.createURI("http://example.org/..."),
NodeFactory.createURI("http://..."),
NodeFactory.createLiteral("10", XSDinteger));
但是,如果您希望此方法快速,我建议您使用即将发布的 marklogic-jena 1.0.2 或 3.0.2。
您提到的 mergeGraph 方法确实附加了三元组。您可以使用 replaceGraph 来替换三元组。关于三元组存储需要注意的重要一点是,它就像一个 key/value 图形存储。使用图形名称来确定要将哪一组三元组更新为一组。您将在 jena Java文档中看到您可以一次操作整个图形:
dsg.addGraph(graphName, graph);
我们正在开发一个使用 Marklogic 作为实体文档存储的应用程序。我们计划使用语义建立实体之间的关系。
例如:Company 是一个实体,"ABC Corporation" 是 Company 实体的一个实例。同样,Truck 是一个实体,"Volvo 101" 是 Truck 实体的一个实例。
当用户在 UI.
中创建业务实体实例时,我们打算通过如下创建三元组来定义这些关系然而,当我们使用 GraphManager.merge() 时,我们会遇到问题,因为每次主语、谓语和宾语相同时,此方法都会向图中添加新的三元组。现有的三元组不会被覆盖。
我们也尝试了 write/writeAs 方法,仍然看到相同的行为。
我们还查看了 Marklogic 提供的 sesame 和 jena api,但找不到好的文档。如果我们打算进行大量语义操作并动态构建三元组,哪个 api 更适合用于语义? Marklogic-java-api or sesame or jena?
代码片段:
String subjectURI = "http://example.org/entityinstance/ABCCorporation";
String predicateURI = "http://example.org/relation/instanceof";
String objectURI = "http://example.org/entity/company";
String graphURI = "http://example.org/graph/Relation";
public void createTriple(String subjectURI, String predicateURI,
String objectURI, String graphURI)
{
DatabaseClient client = markLogicConnectionHelper.getMLConnection();
String tripleStore = "<" + subjectURI + ">" + " " + " <" + predicateURI
+ ">" + " " + "<" + objectURI + ">" + ".";
GraphManager graphManager = client.newGraphManager();
graphManager.setDefaultMimetype(RDFMimeTypes.NTRIPLES);
graphManager.merge(graphURI, new StringHandle(tripleStore));
}
如果您想构建三元组,您将需要为 Java 使用 RDF API。 jena 和 sesame 就是两个这样的 API。芝麻已经变成了rdf4j。
那些 API 都提供了创建和操作三元组和图形的好方法。 如果你使用 marklogic-jena,你可以使用 Jena 的持久化机制将这些图存储在 MarkLogic 中。
DatabaseClient client = DatabaseClientFactory.newClient(...);
JenaDatabaseClient c = new JenaDatabaseClient(client);
MarkLogicDatasetGraph dsg = new MarkLogicDatasetGraph(c);
dsg.add(NodeFactory.createURI("http://..."),
NodeFactory.createURI("http://example.org/..."),
NodeFactory.createURI("http://..."),
NodeFactory.createLiteral("10", XSDinteger));
但是,如果您希望此方法快速,我建议您使用即将发布的 marklogic-jena 1.0.2 或 3.0.2。
您提到的 mergeGraph 方法确实附加了三元组。您可以使用 replaceGraph 来替换三元组。关于三元组存储需要注意的重要一点是,它就像一个 key/value 图形存储。使用图形名称来确定要将哪一组三元组更新为一组。您将在 jena Java文档中看到您可以一次操作整个图形:
dsg.addGraph(graphName, graph);