我们正在开发一个使用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));
}
答案 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);