Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph Marklogic中的部分文档读取和按属性分页_Graph_Pagination_Marklogic_Marklogic 8_Nosql - Fatal编程技术网

Graph Marklogic中的部分文档读取和按属性分页

Graph Marklogic中的部分文档读取和按属性分页,graph,pagination,marklogic,marklogic-8,nosql,Graph,Pagination,Marklogic,Marklogic 8,Nosql,我正在研究使用Marklogic的医疗系统。不久前,我问了一个问题(),这导致我们决定使用一个大型患者文档来保存患者的大部分信息。出于本例的目的,我将展示一个简化的患者文档,其中包含一系列预约 简化的患者文档 { "firstName": "Chauncey", "lastName": "Hays", "memberId": "KLKB XMQ 77", "dateOfBirth": "1971-09-11", "gender": "MALE",

我正在研究使用Marklogic的医疗系统。不久前,我问了一个问题(),这导致我们决定使用一个大型患者文档来保存患者的大部分信息。出于本例的目的,我将展示一个简化的患者文档,其中包含一系列预约

简化的患者文档

{
    "firstName": "Chauncey", 
    "lastName": "Hays", 
    "memberId": "KLKB XMQ 77", 
    "dateOfBirth": "1971-09-11", 
    "gender": "MALE", 


    "appointments": [
        { 
            "name": "Follow Up", 
            "start": "2017-06-08T23:13:00Z", 
            "end": "2017-06-09T00:43:00Z" 
        },
        {
            "name": "Follow Up", 
            "start": "2017-06-09T23:13:00Z", 
            "end": "2017-06-10T00:43:00Z" 
        }
    ]

}
我们的一个用例是返回由患者数据过滤的分页预约(患者文档的属性),例如,查找所有男性患者的预约页面。我们已经和它斗争了一段时间,没有运气。我看到的解决方案之一(可能有点过度设计)是返回患者页面(患者页面可能导致预约数量大于页面大小),并在服务器端过滤掉预约

我的主要问题是:在Marklogic中按患者数据(性别=男性)过滤、部分读取(读取预约)和按预约(患者文档的属性)分页结果是否可行?
非常感谢您的评论。

您是对的,对于您的用例,结构化查询选项“”将不起作用,因为您的查询过滤器位于可搜索表达式之外。然而,以下是我尝试的匹配0结果:

String query = "{ \"search\": {" +
  "\"query\": {" +
  "  \"value-query\": {" +
  "    \"json-property\": \"gender\"," +
  "    \"text\": \"MALE\"" +
  "  }" +
  "}," +
  "\"options\": {" +
  "  \"searchable-expression\": {" +
  "    \"text\": \"appointments\"" +
  "  }" +
  "}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
  queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
queryMgr.search(queryDef, new SearchHandle());
虽然工作正常,但正如您所描述的,您实际上是在对文档进行分页,而不是对提取的部分进行分页。尽管如此,以下是我尝试正确匹配并返回所需结果的内容,但没有提供按需分页的方法:

String query = "{ \"search\": {" +
  "\"query\": {" +
  "  \"value-query\": {" +
  "    \"json-property\": \"gender\"," +
  "    \"text\": [\"MALE\"]" +
  "  }" +
  "}," +
  "\"options\": {" +
  "  \"extract-document-data\": {" +
  "    \"extract-path\": \"/appointments\"" +
  "  }" +
  "}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
  queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
DocumentManager docMgr = client.newDocumentManager();
DocumentPage page = docMgr.search(queryDef, 1);
因此,我认为您需要求助于服务器端脚本,理想情况下是以脚本的形式。或者你可以做一个简单的测试。在模块数据库中以“/ext/pageAppoints.xqy”的形式安装此脚本:

  declare variable $start as xs:long external;
  declare variable $pageLength as xs:long external;
  let $appointments :=
    cts:search(collection(), cts:json-property-value-query("gender", "MALE"))/appointments
  return $appointments[$start to ($start + $pageLength - 1)]
然后在Java中运行此命令:

ServerEvaluationCall call = client.newServerEval()
  .modulePath("/ext/pageAppointments.xqy")
  .addVariable("start", 1)
  .addVariable("pageLength", 10);
EvalResultIterator results = call.eval();
try {
  for ( EvalResult result : results ) {
    JsonNode appointment = result.getAs(JsonNode.class);
    System.out.println(appointment);
  }
} finally { results.close(); }

您是对的,对于您的用例,结构化查询选项“”将不起作用,因为您的查询筛选器位于可搜索表达式之外。然而,以下是我尝试的匹配0结果:

String query = "{ \"search\": {" +
  "\"query\": {" +
  "  \"value-query\": {" +
  "    \"json-property\": \"gender\"," +
  "    \"text\": \"MALE\"" +
  "  }" +
  "}," +
  "\"options\": {" +
  "  \"searchable-expression\": {" +
  "    \"text\": \"appointments\"" +
  "  }" +
  "}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
  queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
queryMgr.search(queryDef, new SearchHandle());
虽然工作正常,但正如您所描述的,您实际上是在对文档进行分页,而不是对提取的部分进行分页。尽管如此,以下是我尝试正确匹配并返回所需结果的内容,但没有提供按需分页的方法:

String query = "{ \"search\": {" +
  "\"query\": {" +
  "  \"value-query\": {" +
  "    \"json-property\": \"gender\"," +
  "    \"text\": [\"MALE\"]" +
  "  }" +
  "}," +
  "\"options\": {" +
  "  \"extract-document-data\": {" +
  "    \"extract-path\": \"/appointments\"" +
  "  }" +
  "}}}";
QueryManager queryMgr = client.newQueryManager();
RawCombinedQueryDefinition queryDef =
  queryMgr.newRawCombinedQueryDefinitionAs(Format.JSON, query);
DocumentManager docMgr = client.newDocumentManager();
DocumentPage page = docMgr.search(queryDef, 1);
因此,我认为您需要求助于服务器端脚本,理想情况下是以脚本的形式。或者你可以做一个简单的测试。在模块数据库中以“/ext/pageAppoints.xqy”的形式安装此脚本:

  declare variable $start as xs:long external;
  declare variable $pageLength as xs:long external;
  let $appointments :=
    cts:search(collection(), cts:json-property-value-query("gender", "MALE"))/appointments
  return $appointments[$start to ($start + $pageLength - 1)]
然后在Java中运行此命令:

ServerEvaluationCall call = client.newServerEval()
  .modulePath("/ext/pageAppointments.xqy")
  .addVariable("start", 1)
  .addVariable("pageLength", 10);
EvalResultIterator results = call.eval();
try {
  for ( EvalResult result : results ) {
    JsonNode appointment = result.getAs(JsonNode.class);
    System.out.println(appointment);
  }
} finally { results.close(); }

非常感谢。我真的很感谢你的帮助!非常感谢。我真的很感谢你的帮助!