2017-04-18 49 views
2

我试图用marklogic-的Java API与下列限制搜索我的数据库中的XML的搜索记录中的所有目录,除了一个:如何Marklogic

1)一个特殊的XML标签必须包含前我给定值: tradeId必须等于什么,我通过

2)结果必须由我提供的藏品躺在

3)结果可在marklogic数据库的任何地方在于,除了在一个特定的目录

我没有解决方案到第3点。符合我的前两条标准的记录很少有以/ TRADES/*开头的URI,所以我想在除“目录”/“TRADES”目录之外的任何地方进行搜索。

这是我的代码的外观:

public static List<DocumentPage> getResults() throws KeyManagementException, NoSuchAlgorithmException, 
     KeyStoreException, CertificateException, IOException { 


    String tradeId = "XYZ"; 

    DatabaseClient client = getDBClient(); 
    QueryManager queryMgr = client.newQueryManager(); 
    XMLDocumentManager xmlMngr = client.newXMLDocumentManager(); 

    StringHandle rawHandle = new StringHandle(); 
    rawHandle.withFormat(Format.XML).set(getQueryToFetchMessagesByTradeId(tradeId)); 
    RawQueryByExampleDefinition querydef = queryMgr.newRawQueryByExampleDefinition(rawHandle); 

    querydef.setCollections("/messages/processed", /messages/toBeProcessed"); 
    querydef.setDirectory("/"); 

    return getDocumentPageList(querydef, client); 
} 

private static String getQueryToFetchMessagesByTradeId(String tradeId) { 

    String query = "<q:qbe xmlns:q=\"http://marklogic.com/appservices/querybyexample\">\n" + "<q:query>\n<q:word>" 
      + "<tradeId tradeIdScheme=" + "\"http://www.abcd.com/internalid/trade-id\"" + ">" + tradeId 
      + "</tradeId></q:word>\n" + "</q:query>\n" + "</q:qbe>"; 
    return query; 
} 

任何帮助,高度赞赏。

+0

不知道关于Java的实现,但是'CTS:不查询(CTS:目录查询( “贸易”, “1”))'将是XQuery的等价物。 –

回答

3

我没有看到一个选项,可以通过示例语法在查询中编写元数据(目录)查询。所以你必须改用结构化查询。我发现它们在Java中更具可读性,因为它们不需要字符串连接。使用StructuredQueryBuilder像这样:

StructuredQueryBuilder qb = new StructuredQueryBuilder(); 
StructuredQueryDefinition querydef = 
    qb.and(
     qb.containerQuery(
     qb.element(new QName("http://www.abcd.com/internalid/trade-id", "tradeId")), 
     qb.and(
      qb.term(tradeId), 
      qb.value(
      qb.elementAttribute(
       qb.element(new QName("http://www.abcd.com/internalid/trade-id", "tradeId")), 
       qb.attribute("tradeIdScheme") 
      ), 
      "http://www.abcd.com/internalid/trade-id" 
     ) 
     ) 
    ), 
     qb.not(
     qb.directory(1, "/TRADES/") 
    ) 
); 

querydef.setCollections("/messages/processed", "/messages/toBeProcessed") 

return getDocumentPageList(querydef, client); 
+0

喜山姆 我需要搜索只具有下面的XML标记个XML: “MY_TRADE_ID” 代码由你提供的工作正常,没有QNAME检查,但是当我传递给QName中的tradeIdScheme属性值和实际的交易ID时,它失败了。 引用您的代码,您能告诉我如何搜索具有特定属性值并包含特定值的XMLTag。 谢谢 –

+0

对不起。我更新了我的答案以包含属性查询。 –

+0

你岩山姆,它工作:) –