@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
178 lines (176 loc) • 7.29 kB
TypeScript
import type Accessor from "../../core/Accessor.js";
export interface GraphQueryStreamingResultProperties extends Partial<Pick<GraphQueryStreamingResult, "resultRowsStream">> {}
/**
* The result of a [executeSearchStreaming()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeSearchStreaming) or
* [executeQueryStreaming()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeQueryStreaming) on a knowledge graph service.
* Contains a readable stream of objects that match the search or query criteria. The readable stream must be decoded using a
* [getReader()](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader) function in order to access the returned graph data.
*
* @since 4.25
* @see [executeSearchStreaming()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeSearchStreaming)
* @see [executeQueryStreaming()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeQueryStreaming)
* @example
* // sample executeSearchStreaming that would return a GraphQueryStreamingResult
* KnowledgeGraphModule.executeSearchStreaming(
* knowledgeGraph,
* {
* searchQuery: "solar",
* typeCategoryFilter: "entity",
* returnSearchContext: false,
* start: 1, // index of the first record to return
* num: 200, // return 200 records.
* namedTypesFilter: ["Company", "Supplier", "Part"],
* idsFilter: ["{9D2D6AFD-41F1-49A4-8412-CACCC9906E88}",
* "{25WNN24S-41F1-49A4-8412-ANIWN9906E88}",
* "{NS51HE8D-41F1-49A4-8412-5HNIRH9906E8}"]
* }
* ).then((streamingSearchResult)=>{
* // the result of a streaming search is a readableStream which requires decoding.
* readStream(streamingSearchResult)
* })
* @example
* // the returned readable stream before decoding
* {
* resultsRowsStream: {
* locked: true
* }
* }
* @example
* // sample streaming query using bind parameters
* // to search for entities with a the `name` property that matches a specific string
* // or have their geometry within a bounding box.
* // get all parts bought by each supplier.
* // query returns both the supplier and the part it buys.
* const query = `MATCH (s:Supplier)-[:buys_part]-(p:Part) RETURN s,p`;
*
* KnowledgeGraphModule.executeQueryStreaming(knowledgeGraph, query})
* .then((streamingQueryResult)=>{
* // streaming query returns a readableStream which must be read to access the returned graph data
* readStream(streamingQueryResult);
* })
* @example
* // a function to read the readable stream returned from the above query
* const readStream = async (streamingQueryResult) => {
* let time = Date.now();
* let reader = streamingQueryResult.resultRowsStream.getReader();
* try {
* while (true) {
* const { done, value } = await reader.read();
* if (done) {
* console.log(`Completed database requests: ${(Date.now() - time) / 1000} seconds`, value);
* break;
* }
* console.log(`Chunk returned in: ${(Date.now() - time) / 1000} seconds`, value);
* // use the results
* // list the parts bought by each supplier
* let supplierParts = {};
* // each element of the result array will contain one supplier and one part it buys
* for (var v in value){
* let supplier = value[v][0].properties.Name
* let part = value [v][1].properties.Name
* if(!(supplier in supplierParts)){
* supplierParts[supplier] = [];
* }
* // collect parts by supplier that buys them
* supplierParts[supplier].push(part);
* console.log(supplierParts);
* // result printed to the console: {Supplier 1:[Part1], Supplier 3:[Part2, Part3]}
* }
* } catch (err) {
* if (err.name === "AbortError") {
* console.log("Request aborted as expected");
* } else {
* throw err;
* }
* }
* };
* @example
* // sample result of streaming search result chunk read and printed to the console.
* // the reader will continue to return chunks until the stream is complete
* // and all matching results are returned
*
* "Streaming chunk returned in: 0.082 seconds"
* [
* [{
* "declaredClass": "esri.rest.knowledgeGraph.Entity",
* "properties": {
* "Name": "Suncommon",
* "Employee_Count": 400,
* "energyType": "solar"
* },
* "typeName": "Company",
* "id": "{25WNN24S-41F1-49A4-8412-ANIWN9906E88}"
* }],
* [{
* "declaredClass": "esri.rest.knowledgeGraph.Entity",
* "properties": {
* "Name": "Quality Solar Supply",
* "Supplier_code": "158B",
* "City": "New Orleans",
* },
* "typeName": "Supplier",
* "id": "{GE5G1E8D-41F1-49A4-8412-QNG5EG48SG8S}"
* }],
* [{
* "declaredClass": "esri.rest.knowledgeGraph.Entity",
* "properties": {
* "Name": "Solar panel",
* "panel_type": "Polycrystalline",
* "price_per_unit": 400
* },
* "typeName": "Part",
* "id": "{9D2D6AFD-41F1-49A4-8412-CACCC9906E88}",
* }]
* ]
*/
export default class GraphQueryStreamingResult extends Accessor {
constructor(properties?: GraphQueryStreamingResultProperties);
/**
* Readable stream of objects matching [executeSearchStreaming()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeSearchStreaming)
* or [executeQueryStreaming()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeQueryStreaming) criteria.
* Requires decoding using the [getReader()](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader) method.
*
* @example
* // example of result decoding.
* // execute streaming query on a knowledge graph
* kgModule.executeQueryStreaming(
* kg,
* {
* openCypherQuery: "MATCH (n) RETURN n LIMIT 500",
* }
* ).then((streamingQueryResult) => {
* readStream(streamingQueryResult);
* })
*
* //read the ReadableStream result
* const readStream = async (streamingQueryResult) => {
* let time = Date.now();
* // create new stream reader
* let reader = streamingQueryResult.resultRowsStream.getReader();
* try {
* // while the stream is returning data
* while (true) {
* const { done, value } = await reader.read();
* // the stream has finished retrieving all matching records from the database
* if (done) {
* console.log("Client Query stream completed");
* break;
* }
* // do something with the result records returned in each chunk
* console.log(
* `Client Query Result at Time ${Date.now() - time}:`,
* value
* );
* }
* // if stream is aborted by user return message, otherwise throw error
* } catch (err) {
* if (err.name === "AbortError") {
* console.log("Request aborted as expected");
* } else {
* throw err;
* }
* }
* };
*/
accessor resultRowsStream: ReadableStream;
}