【问题标题】:allegro graph - federate repositories located on different serverallegro 图 - 位于不同服务器上的联合存储库
【发布时间】:2014-02-18 06:37:45
【问题描述】:

我正在尝试创建一个抽象存储库,用于在 Allegro Graph 上进行联邦搜索。我能够连接到存储在不同服务器上的存储库。但是,当我尝试使用联邦合并它们时,它会抛出一个错误,即在第二台服务器上找不到 repo。有没有办法将存储在不同服务器上的两个存储库组合成一个可以进行联邦搜索的抽象存储库?

    AGServer server = new AGServer(SERVER_URL1, USERNAME1, PASSWORD1);
    AGRepository repo1 = server.getRootCatalog().openRepository(REPO1);


    AGServer server2 = new AGServer(SERVER_URL2, USERNAME2, PASSWORD2);
    AGRepository repo2 = server2.getRootCatalog().openRepository(REPO2);

    System.out.println(repo1.getConnection().size());
    System.out.println(repo2.getConnection().size());

    AGAbstractRepository combinedRepo = server.federate(repo1, repo2);
    combinedRepo.initialize();

    combinedRepo.getConnection(); //this return an exception


    Exception in thread "main" org.openrdf.repository.RepositoryException: org.openrdf.repository.RepositoryException: Repository not found with ID: REPO2
        at com.franz.agraph.repository.AGCatalog.openRepository(AGCatalog.java:264)
...
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
    Caused by: org.openrdf.repository.RepositoryException: Repository not found with ID: REPO2
        at com.franz.agraph.repository.AGCatalog.openRepository(AGCatalog.java:260)
        ... 6 more

TIA

【问题讨论】:

    标签: java sesame allegrograph


    【解决方案1】:

    Sesame 框架支持Federation Sail,您可以使用它来将多个 Sesame 存储库(位于不同的服务器/位置)包装到一个虚拟存储中。您可以尝试使用它,而不是使用 Allegrograph 的定制联合代码(这似乎仅适用于单个服务器上的多个存储库):

     // create your AG repositories the same way
     AGServer server = new AGServer(SERVER_URL1, USERNAME1, PASSWORD1);
     AGRepository repo1 = server.getRootCatalog().openRepository(REPO1);
    
     AGServer server2 = new AGServer(SERVER_URL2, USERNAME2, PASSWORD2);
     AGRepository repo2 = server2.getRootCatalog().openRepository(REPO2);
    
     // Use a Sesame Federation to combine them
     org.openrdf.sail.federation.Federation federation = new Federation();
     federation.addMember(repo1);
     federation.addMember(repo2);
     federation.setReadOnly(true); // assuming you only use it for query
    
     Repository combinedRepo = new SailRepository(federation);
     combinedRepo.initialize();
    

    (ObDisclaimer:上面的代码是我头脑中写的,我可能忽略了一个必要的配置细节来让它工作 - 但你希望能明白要点)

    另一种方法是通过 SERVICE 子句使用 SPARQL 对联合的支持。这将要求您要查询的每个存储库都可以通过 HTTP 作为 SPARQL 端点进行访问。

    【讨论】:

      【解决方案2】:

      我能够使用 Allegro Graph 的 AGServer 创建一个联合存储库。以下是我为那些可能会觉得有帮助的人所做的:

      AGVirtualRepository s = server2.virtualRepository("<http://<ip address>:10035/repositories/repo1> + <http://<ip address>:10035/repositories/repo2>");
      AGRepositoryConnection combinedConn = s.getConnection();
      

      【讨论】:

      • 我了解您的解决方案并尝试过,但在AGRepositoryConnection combinedConn = s.getConnection(); 行中出现错误。错误说:服务器未能响应
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2014-10-18
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      相关资源
      最近更新 更多