使用java api

时间:2016-09-29 17:23:14

标签: marklogic

我们正在开发一个使用Marklogic作为实体的文档存储的应用程序。我们计划使用语义在实体之间建立关系。

例如:公司是一个实体," ABC公司"是公司实体的实例。同样,卡车是一个实体,"沃尔沃101"是Truck实体的一个实例。

当用户在UI中创建业务实体实例时,我们打算通过创建三元组来定义这些关系。

然而,当我们使用GraphManager.merge()时,我们遇到了问题,因为每当主语,谓词和对象相同时,此方法就会向图中添加新的三元组。现有的三重奏不会被覆盖。

我们还尝试了write / writeAs方法,但仍然看到了相同的行为。

我们还查看了由Marklogic提供的芝麻和jena api,但无法找到好的文档。如果我们打算进行大量的语义操作并动态构建三元组,这是用于语义的更好的api? Marklogic-java-api或sesame还是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));

}

1 个答案:

答案 0 :(得分:3)

如果要构建三元组,则需要使用RDF API for Java。 jena和芝麻是两个这样的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替换三元组。关于三重商店的重要注意事项是,它就像图表的键/值存储一样。使用图形名称确定要作为一组更新的三元组集。您将在jena JavaDocs中看到您可以一次操作整个图形:

dsg.addGraph(graphName, graph);