2016-09-29 48 views
2

我們正在開發一個使用Marklogic作爲實體的文檔存儲的應用程序。我們正計劃使用語義建立實體之間的關係。使用java api在marklogic中創建三元組

例如:公司是一個實體,「ABC公司」是公司實體的一個實例。同樣,卡車是一個實體,「沃爾沃101」是卡車實體的一個實例。

我們打算通過在用戶在UI中創建業務實體實例時創建三元組來定義這些關係。

但是我們在使用GraphManager.merge()時遇到了問題,因爲每次主體,謂詞和對象相同時,此方法都會爲圖添加新的三元組。現有的三元組沒有被覆蓋。

我們也嘗試了write/writeAs方法,仍然看到相同的行爲。

我們還查看了Marklogic提供的sesame和jena api,但找不到好的文檔。如果我們打算做大量的語義操作並動態構建三元組,這對於語義學來說是更好的api? Marklogic-java-api或芝麻還是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)); 

} 

回答

3

如果你想建立的三倍,你將要使用的Java的RDF API。 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 - 耶拿1.0.2或3.0.2的版本。

您提到的mergeGraph方法會追加三元組。您可以使用replaceGraph來替換三元組。關於三重商店的重要注意事項是,它就像圖形的關鍵/價值存儲區。使用圖表名稱來確定您想要更新爲一組的三元組集合。您會在jena JavaDocs中看到您可以一次操作整個圖表:

dsg.addGraph(graphName, graph);