Abstract:
An inference engine in a knowledge base system may be invoked by an application program (e.g., a COBOL program), by arranging to detect, in the program, instructions whose syntax complies with the syntax requirements of a predefined data base manipulation language (e.g., SQL), and then executing the instruction by invoking the inference engine. As a result, the application programmer can implicitly and transparently take full advantage of the facilities of the inference engine using simple, known data base manipulation language statements. In other aspects, the &#34;if (condition)&#34; side of an inference rule triggers the inference engine to execute a sequence of steps based on a class of facts referred to in the condition and based on prestored information identifying the storage scheme for that class of facts; facts retrieved from an external data base are filtered to eliminate unneeded facts, before transducing the remaining, needed facts into the temporary storage space; and the knowledge base system exercises control of the cursor control mechanism of an external data base in order to retrieve facts one by one as needed by the inference engine.

Description:
This is a continuation of copending application(s) Ser. No. 07/492,382 filed on Mar. 8, 1990, abandoned in which is a continuation of Ser. No. 07/219,980 filed on Jul. 15, 1988 abandoned. 
    
    
     BACKGROUND OF THE INVENTION 
     This invention relates to knowledge base systems. 
     In such systems, prestored rules and facts form a knowledge base from which useful inferences and conclusions may be drawn by an inference engine. 
     Commercially available knowledge base system shells include such an inference engine together with facilities that aid the system developer in defining the rules and facts for a given application, and an interface that enables a user to query the system from an interactive terminal. 
     Some of the facts required for a given application may be available in an already established data base; and the knowledge base system may need to use those facts in responding to a query. 
     Information is stored and retrieved in data bases typically via a query language such as SQL (structured query language) which, for example, can be used to specify criteria for searching the data base to locate a desired fact. 
     SUMMARY OF THE INVENTION 
     In general, in one aspect, the invention features enabling an inference engine in a knowledge base system to be invoked by an application program (e.g., a COBOL program), by arranging to detect, in the program, instructions whose syntaxes comply with the syntax requirements of a predefined data base manipulation language (e.g., SQL), and then executing the instructions by invoking the inference engine. As a result, the application programmer can implicitly and transparently take full advantage of the facilities of the inference engine using simple, known data base manipulation language statements. 
     Preferred embodiments of the invention include the following features. The data base manipulation language includes a type of instruction whose normal function is to insert a record (occurrence) into a data base; and such an instruction, when included in the application program, is executed by passing the record to the inference engine for assertion in a set of inference rules within the knowledge base system. The inference rules are compiled in a Rete network of nodes and the inference engine applies the value by asserting it at the top node of the network. The data base manipulation language also has a type of instruction whose normal function is to state a query seeking records located in a data base; and such an instruction, when included in the application program, is executed by passing the query to the inference engine for response based in part on a set of inference rules within the knowledge base. The data base manipulation language also has a type of instruction whose normal function is to update a data base field or column with a value; and such an instruction, when included in the application program, is executed by passing the attribute and value to the inference engine for assertion in a set of inference rules in the knowledge base system. The data base manipulation language also has a type of instruction whose normal function is to delete a data base occurrence or record from the data base; and such an instruction, when included in the application program, is executed by passing the occurrence to the inference engine for assertion of the deletion in a set of inference rules in the knowledge base system. In some embodiments, the data base manipulation language instructions are executed without referring to an actual external data base. Also responses to the instructions may be delivered back to the application program in accordance with action nodes of the Rete network. 
     In general, another aspect of the invention features enabling an inference engine in a knowledge base system to test the &#34;if (condition)&#34; portion of a rule which refers to a class of facts (i.e., an object), regardless of the storage scheme under which the facts have been stored; prior to testing the condition, information is stored identifying the storage scheme for each class of facts; when a class is named in the &#34;if (condition)&#34; portion of the rule, the inference engine is caused to execute a sequence of steps directed to retrieval of the facts and that sequence of steps is selected based on the class, and on the information identifying the storage scheme. As a result, the developer who prepares the rules may do so merely by naming classes of facts without regard to the ultimate location where, or storage scheme under which, any particular class of facts may be stored. 
     Preferred embodiments of the invention include the following features. One of the storage schemes includes storage, in an external data base, of a class of facts which is to be used only temporarily by the inference engine; the sequence of steps is part of a network of steps which enable retrieval of facts corresponding to each rule of the knowledge base system; and the steps in the network are organized by clustering together steps which involve retrieval of facts from a given external data base. The steps are also organized so as to defer execution of steps which cause retrieval of facts from the external data base until other steps required for testing the &#34;if (condition)&#34; side of the rule have been executed. 
     In another general feature of the invention, the facts needed from the external data base are stored in conjunction with other, unneeded facts; the inference engine has an associated temporary storage space for storing the temporarily needed facts after retrieval from the data base; both the needed and unneeded facts are fetched from the data base; but the needed facts are not transduced into the temporary storage spaced until the unneeded facts are filtered out. Thus, the temporary storage space does not become overloaded with unneeded facts. 
     In another general feature of the invention, a series of temporarily needed, related facts are available in successive record locations of an external data base; the external data base management system includes a cursor control mechanism for pointing to successive record locations; and the knowledge base system exercises control of the cursor control mechanism to retrieve the facts one by one as needed by the inference engine. In that way, the knowledge base system does not become overloaded by a requirement to retrieve multiple records at once. 
     Other advantages and features will become apparent from the following description of the preferred embodiment, and from the claims. 
     DESCRIPTION OF THE PREFERRED EMBODIMENT 
     We first briefly describe the drawings. 
    
    
     FIG. 1 is a block diagram of a knowledge base management system. 
     FIGS. 2A through 2D are successive pages of a listing of an example of an expert system for aiding the bagging of grocery items. 
     FIG. 3 is a more detailed block diagram of portions of the knowledge base management system of FIG. 1. 
     FIG. 4 is a representative portion of an example of a Rete network. 
     FIG. 5 is a diagram of an interpret node. 
     FIGS. 6 through 10 are examples of node trees. 
     FIGS. 11, 12, 13 are diagrams of node structures for three rules of FIG. 2. 
     FIGS. 14, 15, 16 are diagrams of three stages in the development of a portion of a Rete network. 
     FIG. 17 is a diagram of a portion of a data flow network and its relationship to a Rete network and data bases. 
     FIG. 18 is a block diagram of a data flow evaluator and related elements of the knowledge base management system. 
     FIG. 19 is a block diagram of the relationship between application software and the knowledge base management system. 
     FIG. 20 is a block diagram of a portion of a data flow network relevant to a COBOL request. 
    
    
     STRUCTURE AND OPERATION 
     Referring to FIG. 1, a knowledge base management system (KBMS) 10 includes a KBMS shell 12 in the form of a compiled software program written in the `C` language and stored in the memory of a computer. The KBMS shell has a rule and object editor 14 which converts the rules and facts defined by a knowledge base system developer into a form useful to an inferencing engine 16. 
     Rules and groups of rules (called packets) 20 are stored in a knowledge base 18. The knowledge base 18 also includes a knowledge data base 22 which, among other things, stores facts loaded by the system developer or in some cases by the user. 
     Once an application has been developed, queries may be directed to the system either from application software (e.g., a COBOL program) 24, or by a user via an interactive terminal 26. 
     In the case of application programs, queries are embedded, for example, in the COBOL program in the form of instructions that conform to the syntax of SQL. An application software interface 28 includes a preprocessor 30 which converts the SQL queries to a series of instructions that enable the queries to be passed via a link 31 to KBMS when the appropriate place is reached in the application software. As discussed below, even though the SQL instructions in the application software are phrased as simple data base queries, the KBMS treats them as inputs to the knowledge base and, via the inference engine, automatically (and transparently to the programmer who wrote the application software) applies the full power of the knowledge base system in executing the instruction. 
     In the case of user queries from an interactive terminal, a query facility and user interface 32 aids the user and converts the queries to a form which can be handled by KBMS. 
     The inferencing engine includes an agenda facility 34 which schedules the execution of actions appearing on an agenda 35. Actions are entered onto the agenda from the inference (action) sides of rules when the condition sides of the rules have been satisfied. 
     Facts needed by the inferencing engine are stored in the knowledge data base either as facts entered by the system developer or the user, or as facts fetched into the knowledge data base from external data bases managed by external data base management systems, for example, VSAM, SQL, DB2, and others 40, 42, 44, 46. The SQL DBMS, for example, includes a data base shell 48 (which provides a variety of facilities including interpretation of queries, and organization and management of the data base) and a data base 50 in which the facts are stored. The KBMS shell includes VSAM, SQL, DB2, and other interfaces 52, 54, 56, 58 which enable (i) queries to be passed to the DBMSs in the appropriate form to retrieve needed facts, (ii) the retrieved facts to be provided to the KBMS shell in a useful form, and (iii) facts to be stored in the data base. For example, the SQL interface sends queries to the SQL DBMS in the SQL language, just as the application software 24 may do via link 51. Different DBMSs provide different levels of management and support for the data bases contained within them, and KBMS structures the queries to various data bases in a way that takes advantage of facilities available in the external DBMSs. 
     As discussed below, the rule and object editor 14 also structures the queries to the external data bases in a manner that is efficient and transparent to the developer who writes the rules or to the user who phrases the queries. All that is required of the developer is initially to identify the data base where a given fact will be found. Thereafter, any reference to that fact will automatically be handled via the appropriate data base. 
     Facts of interest in the system are organized in so-called objects, which are like files. 
     Referring to FIG. 2A, for example, in a knowledge base system whose function is to aid the bagging of groceries at the checkout counter of a supermarket, each object (e.g., object 60) represents a file of information needed by the knowledge system. Each object is defined by the developer and may be thought of as an initially empty table in which occurrences (entries) may be placed in rows. Each column of the table represents an attribute which characterizes the occurrences. For each attribute there may be a number of possible values. Thus, each cell of the table may contain a value for the corresponding attribute and occurrence. 
     For example, object 60 is called `item` and keeps track of which bag contains each grocery item that has been purchased. Thus, each occurrence in the object named item has two attributes, one being the name of a purchased item, and the other the number of the bag (inbag) where it is located. The possible values for each attribute may be defined in advance. In the example of FIG. 2A, there are eleven possible item names, including chips, coke, corn, etc.; the bag number (inbag) may be any two-digit number (type=numeric, width=2). 
     Initially the object named item will have no occurrences, but as items are purchased and bagged, the name of each item and the bag number are entered in the object. (Other objects--for example, object 62, called inventory, which lists information about every grocery item in inventory--may, of course, be loaded with occurrences by the developer before the knowledge base system is made available to the user.) A load command is available for the developer to load occurrences, and loading may also be done by filling entries in an external data base. 
     In defining a given object, the developer specifies whether the object is to be found in an external data base or in the knowledge data base (KDB). In FIG. 2A, for example, the object named item is stored in the KDB (object-type=KDB), while the object named inventory (object 62) is stored in an SQL data base (object-type=SQL) in table AIC40X.BAGINV. 
     The developer also controls a number of other parameters which help to define the object and its role in the system as follows. 
     One parameter is whether or not the object is active. An active object is one which will trigger testing of all rules which refer to the object every time there is a change in one of its values. An inactive object--for example one stored in an external data base--is one which will not be monitored continually for changes in its values. 
     Another parameter is whether the object is temporary or not. In the example, the object named item it temporary, indicating that the occurrences for that item are generated and stored temporarily during a user session, not permanently in advance, and are cleared at the end of the session. 
     A third parameter defines whether there is a key attribute for searching (such as an employee ID number). 
     An object definition may also include a clause that cause certain actions to be taken either when an occurrence is created in the object, when an occurrence is deleted from the object, or whenever an occurrence of the object is called for, if no occurrences then exist. For example, lines 72 on FIG. 2B indicate that when a bag is created in the object named bag, the number of bags should be incremented by 1 and the phrase &#34;opening new bag # --  &#34; should be printed. Similar actions can be attached to attribute definitions to be triggered when assigned or when needed. 
     The developer also defined certain characteristics of each attribute of an object, for example, its type and width, and whether or not it is active. 
     Referring to FIG. 2B, in phrasing a rule for entry into the system, the operative part of, for example, rule B1 (64) begins with an IF clause which sets forth a Boolean expression that must be tested to see if the rule should be fired; here the rule is fired if the grocery order includes an item chips but does not include an item Pepsi. The THEN clause in the rule specifies what action to take if the condition is met; in this case, a new item Pepsi is created and the phrase &#34;Adding Pepsi to Order&#34; is printed. 
     Related rules may be organized in packets. Referring to FIGS. 2B and 2C, packet 66, called bag large, includes three rules whose purpose is to decide how to handle a large grocery item that is ready for bagging. If the item is a bottle and there are fewer than 6 large items in the bag and the item fits in the present bag (its volume is less than the remaining bag volume), then the item is put in the current bag (rule B3). The item is also bagged if it fits and there are fewer than 6 large items in the bag (rule B4). Otherwise the item is put in a new bag (rule B5). 
     In rules B3, B4, B5, the actions taken if the conditions are met include printing a phrase, creating an item, and calling another packet. Other actions that could be taken include, for example, calculating an expression or changing a value of an attribute of an occurrence in some object. 
     Each packet definition begins with a set of parameters by which the developer characterizes the packet. The parameter agenda --  condition indicates what condition will trigger the packet. In packet 66, for example, the agenda --  condition is that the next step is to bag a large item (line 68). The rule --  prefix (line 70) is a condition that is implicitly added to the left side of each rule. Here each rule is presumed to begin with a test of the condition that the item is large and unbagged. The entry --  action and exit --  action parameters specify actions to be taken when entering or exiting the packet. 
     Thus, what distinguishes a packet from a rule are simply the common elements of a packet that will be applied to the rules of that packet as a group. 
     The rules, objects, and other information as entered by the developer in the form shown in FIG. 2 present a complete and concise specification of what the system is to do, but it is necessary to convert that specification into a structure that can be efficiently executed by performing all of the needed searches and executing the appropriate rules using facts fetched from either the KDB or an external data base. 
     The basic data structure used to control the operation of the knowledge base system is a node. Nodes typically refer to primitive elements of tests, to objects and attributes, to relationships, and to actions to be taken when test conditions are satisfied. Nodes usually refer to other nodes and in that way they define sequences of steps to be taken in analyzing the rules of the expert system. 
     Referring to FIG. 3, the nodes and the cross-references define a Rete network (which controls the testing of rules based on available facts and the triggering of actions when test conditions are met) and a related data flow network 302, which controls interaction with the external data bases. Values 304 that become specified, changed, or deleted at the beginning of or during a user session are dropped into the top node of the Rete network. The inferencing engine 16 causes the values to flow through the network, determines when actions may be taken as a result of conditions having been met, loads the actions into the agenda, and after all processing has been completed in the Rete network, manages the execution of the actions listed on the agenda. Execution of actions may produce additions, changes, or deletions of values which are again dropped into the Rete network, and the process is repeated. 
     In executing the steps represented by the Rete network nodes, inferencing engine 16 refers in each case to underlying program instructions that implement each type of step. 
     Similarly, a data flow evaluator 308 carries out the steps called for by the nodes of the data flow network 302 using underlying data base call sequences 310, all in a manner to be described. 
     The data flow evaluator 308 passes data base call sequences 310 to external data bases interfaces 52, 54, 56, 58 which manage the communication links 314 to those external data bases. 
     The nodes of the Rete network are compiled by a network compiler 316 based on node sequences originally generated by a navigator 318. Navigator 318 works from the output of a parser 320 whose main function is to analyze rules 322 and break each rule into primitive units. Once the network compiler 316 has completed its work, for each node of the Rete network that requires access to an external data base, a data flow builder 324 creates and organizes the nodes that form the data flow network. 
     The Rete network is organized as a tree of nodes which represent (a) the primitive tests that make up the rules, and (b) the actions that are triggered by rules whose conditions have been satisfied. 
     Referring to FIG. 4, for example, in a Ret network 80, each primitive test node 82, 84, and 86, represents all of the appearances of a particular primitive test such as A relationship B (e.g., &#34;name=`chips`&#34;) in any of the rules of the knowledge base. Nodes 88 and 90 represent actions (specified in rules) to be performed when an appropriate set of test have been satisfied. For example, action M would be triggered when A rel B and C rel D are true, while action N would be triggered when A rel B and C rel E are true. Because the Rete network identifies primitive tests that are shared in common by different rules, each primitive need be tested only once and the result is then available with respect to all of the rules where that primitive test appears. 
     Associated with each primitive test node is a stored list of occurrences 92, 94, 96. During operation each list stores occurrences which satisfy the test based on existing values for attributes involved in the test. For example, occurrences X, Y, and Z in the object in which B is an attribute may satisfy the primitive test of node 82 and they therefore appear on list 92. Those three occurrences are in effect passed down to the next primitive test node 84 to see if its test is also satisfied for any of the occurrences X, Y, and Z. In FIG. 4, it is assumed that occurrence X also satisfies C rel D; Y therefore appears on list 94. X is then passed down to the action node 88. The occurrence X has then been bound to the action M and that information is placed on agenda 35 indicating that action M is ready for execution. 
     When an application has been developed, to the extent that values of attributes have been assigned they are passed through the Rete network via a top node 96 and the occurrences for any primitive tests that are satisfied are added to the corresponding occurrence lists. During operation of the application, as values are added, deleted, or changed, the modifications are processed through the Rete network. At any stage of operation, when all values have been processed through the Rete network, any action items listed on the agenda are executed in an order determined by the inferencing engine. Execution of action items will typically trigger other changes in values which must be processed through the Rete network and the process repeats. 
     Processing of a primitive test represented by one of the nodes of the Rete network will typically require fetching occurrences from specified objects and testing the values of the occurrences. For objects stored in KDB, which are typically specified as being active, this generally presents no problem, because occurrences in those objects are continually monitored for changes and are automatically flushed through the Ret network as changes occur. 
     Objects stored in external data bases, on the other hand, may have so many occurrences that they would swamp the Rete network if they were constantly and indiscriminately flushed through the Rete network. To avoid that situation, objects stored in external data bases are designated as inactive and occurrences in those data bases are only retrieved selectively when needed. (KDB objects may also be designated inactive if desired). 
     The rule network is constructed from the developer&#39;s rule and packet test (e.g., FIG. 2) by four components: the parser, navigator, network compiler, and dataflow builder (see FIG. 3). 
     The responsibility of the parser is to take test representing rules, tests, and actions and emit an interpretation of the rules specifying (1) what tests are to be performed on what attributes of which objects, and (2) what actions are to be performed on which attributes and objects and in what order. The form of the parser&#39;s interpretation is a single interpret node supplemented by auxiliary semantic node/word node trees. The order of the tests, any implied relationships between objects being tested, and what mechanism is to perform the tests, is not decided by the parser. 
     The responsibility of the navigator is to take the single interpret node emitted by the parser and emit a tree of interpret nodes designating an order of the subtests in a rule based on the relative expense (processing cost) of performing the subtests. In addition, any implicit relationships between tested objects is made explicit by the navigator by inserting in the relationship slot of the interpret node one of a set of predefined (by the programmer) semantic criteria relationships. The relative expense of a subtest component of a rule test is calculated using the number of occurrences in the referenced objects, the locations where each object is stored, and the boolean and relational operators involved in the subtest. A final responsibility of the navigator is to cluster subtests into subtrees containing references to objects which all are stored in one location, and to break that subtree out of the original test tree and attach it to a new interpret node specific to that location. 
     The responsibility of the network compiler is to take a sequence of interpret trees emitted by the navigator and create a network of test nodes that use single shared tests to represent redundant tests encountered in the sequence of interpret trees. In addition, the compiler detects interpret trees or subtrees that refer to inactive objects and passes them to the dataflow builder. In this way, the compiler partially determines what mechanism is to perform the various subtests by partitioning the tests into those to be performed locally by the inference engine and those yet to be determined by the dataflow builder. 
     The responsibility of the dataflow builder is to take the interpret subtree passed to it by the compiler and generate a dataflow program to it by the supplements the interpret subtree (which specifies location and relative retrieval expenses) with functional specifications that enable retrieval of the occurrences specified by the tests. In addition, the dataflow builder decides and designates what mechanism (either the dataflow evaluator or a specific database) is to perform the tests specified in the incoming interpret tree. 
     In setting up the Rete network, the parser, navigator, network compiler and data flow builder use three types of nodes: interpret nodes, semantic nodes, and word nodes. Each node includes a set of slots. 
     Referring to FIG. 5, a typical interpret node 110 is generated by the parser and corresponds to a rule or query. A search slot 112 identifies the search criterion, for example, SIZE=LARGE AND CONTAINER NOT BOTTLE. A file slot 114 lists the objects which are the subject of the search. A relationships slot 116 holds a set of search criteria based on a relationship between two objects, for example, INVENTORY NAME=ITEM INAME (i.e., the attribute name in the object invention is tested against the attribute iname in the object item). The group by slot 118 indicates a set of summary functions applied to attributes of occurrences grouped on the values of particular attributes, for example, AVERAGE VOLUME, GROUP BY SIZE. The having slot 120 defines a search restriction to be applied to summary occurrences grouped in accordance with the grouped by slot entry. A sort slot 124 specifies the ordering in which occurrences are to be handled, for example, SORT BY QUANTITY AND PRICE. Finally, the action slot 126 specifies actions to be taken if the search criteria (tests) are met. 
     The parser uses the information in the rule test to generate a tree of semantic nodes that break down the requirements of the interpret node into more primitive elements. Referring to FIG. 6, for example, if a rule contained a search criterion for occurrences in an object EMPLOYEE in which SALARY=$30,000, the parser would set up the semantic structure shown. 
     Semantic nodes have four slots: a field slot that holds a pointer to an attribute or an object (the attribute SALARY in our example); a relation slot which defines the relationship being tested (in the example, EQUAL); and left and right slots containing respectively two possible pointers, one to a node to the left of the present node, the other to a node to the right of the present node. In the example, the semantic node A has a null left slot and its right slot points to a semantic node B which in turn points to a word node C in which a fixed value $30,000 has been stored in a value slot. 
     Referring to FIG. 7, for a print command located in the action slot of an interpret node, the parser would build a set of four semantic nodes I, J, K, and L. Node I identifies, in its relation slot, the print action to be performed on the list of attributes identified through the left pointer as semantic nodes J, K, and L. Each node J, K, L identifies, in its field slot, one of the attributes to be printed, and the first two nodes point (in their right slots) to the next semantic node in the sequence. 
     Referring to FIG. 8, a more complicated search could be broken down between one node structure E (like the structure of FIG. 6) and a second similar node structure F (for the test STATE=NEW HAMPSHIRE). The two node structures E and F are then tied respectively to the left and right pointers of a parent semantic node D whose field is null and whose relationship is &#34;=&#34;. 
     Referring to FIG. 9, a similar breakdown could be used for a query for all people who own red cars where the `person ID` attribute in the person object and the `owner ID` in the car object correspond. 
     As another example, FIG. 10 shows the node structure for the tests represented by rule B1 on FIG. 2B. 
     FIGS. 11 through 13 illustrate the steps taken by the navigator, and FIGS. 14 through 16 the steps taken by the network compiler in generating a portion of a Rete network corresponding to rules B7, B8, and B9 of FIG. 2C. (In these FIGS., primitive test nodes--and groups of them--are shown as boxes, and action nodes as ovals). 
     Referring to FIGS. 11 through 13, first the navigator sets up three independent node structures representing respectively the three rules B7, B8, and B9. In doing so it begins with a lossy --  join node 120 which indicates that the primitive tests which follow are meant to be combined so as to screen out any occurrences which do not satisfy all of the tests. Assuming such an occurrence is found, the resulting action is shown in the oval to the right of lossy --  join box, e.g., print `wrapping` name in the case of FIG. 11. Thus FIG. 11 means &#34;If a presently unbagged item is medium sized and frozen, then print a message indicating that it is being wrapped.&#34; 
     Note that FIG. 11 includes primitive tests drawn from the rule --  prefix entry in the packet definition, and that all references to objects which are located in the external data base have been grouped into a single box 122. (As seen in FIG. 2A, frozen, iname, and medium all relate to attributes of an SQL object inventory.) Clustering references to external data bases in this way is important because it will allow fewer, more efficient calls to be made to the data base. 
     Next the network compiler, in several steps, analyzes the sequence of nodes assembled by the navigator. In FIG. 14, the network compiler has assembled in parallel the two sets of nodes corresponding to rules B7 (on the left) and rule B8 (on the right) both emanating from the bag --  medium node. In FIG. 15, the network compiler has added in the nodes of rule B9. By separating out a node 124 for the test `frozen` the navigator has been able to use the `unbagged` and `medium &amp; iname=name` nodes 126, 128 for both rules B8 and B9. Implicitly, the network compiler has made a choice that the inefficiency in a successive test node following the SQL call is smaller than would result in having two nodes requiring two SQL calls in parallel, which would occur if the primitives of node 126 had not been factored as shown. 
     Referring to FIG. 16, the network compiler next recognizes that the unbagged node 130 (FIG. 15) may be combined into a node 132 which not only reduces the number of primitive tests that must be made, but also puts the SQL calling node 134 as low as possible in its chain. 
     To summarize, the resulting section of the Rete network has the advantages that (a) the number of calls to SQL objects have been reduced by segregating and grouping together test primitives that involve SQL objects, and (b) calls to SQL objects are generally deferred to the lowest points in the network, following nodes which refer to objects that already reside in the KDB. 
     One exception to the latter principle of deferring all data base calls as long as possible would be a call for a specific occurrence of an object identified by a key attribute. In that situation it may be desirable to advance the call ahead of others (and to fetch all attributes of the specified occurrence) because various attributes of that occurrence may be needed by different branches of the network and one call made early can obviate the need for multiple later calls. 
     Once the Rete network has been formed, the data flow builder creates groups of additional nodes to execute the external data base calls provided in nodes of the Rete network. 
     The data flow builder is familiar with the functional capabilities of each external data base accessible to the KBMS. Some external data bases (e.g., SQL) will be capable of implementing relatively high-level search strategies, permitting relatively high-level test primitives to be passed directly to the data base. Other external data bases provide only minimal functionality, requiring KBMS to perform many steps which in effect manage the data base search. In order to enable KBMS to perform such steps, the data flow builder is able to create a number of different types of primitive function nodes. (As discussed below, it is the data flow evaluator which actually executes these nodes). 
     Occurrences sent back from an object in a data base may be thought of as appearing in a stream. The primitive functions available from the data flow builder perform various operations on such streams, including the following. 
     A generate function provides a conduit through which a stream of occurrences fetched from the data base are initially passed. A restrict function acts as a filter to screen out any occurrences that fail the test associated with the restrict function. An intersect function receives two streams of occurrences and passes the intersection of the two, e.g., those occurrences which have identical attribute values in both streams. A union function receives two streams of occurrences and passes both of them. 
     In addition, a lossy --  join function receives two streams of occurrences from two objects with N+M occurrences respectively and passes of the N×M occurrences combinations those which pass the join test associated with the losssy --  join function. For example, a search for &#34;cars and their owners&#34; in two objects (where one object lists people and their social security number, and another object lists social security numbers and their cars) would produce a stream containing a list of people and the car owned by each of them. A lossless --  join function representing a search for &#34;everyone and his car&#34; is similar to a lossy --  join except that occurrences of individuals who do not own cars would be included. A failed --  join function for the search &#34;everyone who has no car&#34; would produce all of the occurrences that were included in the stream produced by the lossless --  join example above but which were not included in the lossy --  join examples above. 
     A `unique` function, with respect to an attribute A, receives a stream and passes only occurrences for which the value of A has not yet been in an occurrence. This could be used to effectuate a search for `all counties in which customers of the company have warehouses` in an object which lists warehouses and their addresses, where multiple warehouses are located in particular counties. 
     An exists function generates a yes or no output based on whether an occurrence meets the associated criterion. A not exists function would produce an output opposite to the output of the exists function. 
     A sort function receives a stream and produces an output stream of occurrences sorted by specified attributes. 
     A grouping function implements a specified action on the occurrences of a stream on a group by group basis. The group by function could implement, for example, a request for the average salary of employees grouped by state. 
     An RHS (right-hand side) function applies an action list to each occurrence in an input stream. 
     Referring to FIG. 17, as an example of how the data flow builder makes use of the available functions, consider a Rete network node 130 which specifies, as a test, to do a lossy --  join of object X, stored in an SQL database Q 127, with object Y stored in a sequential file (SEQ) 129 such that attribute C has the same value in the occurrences of both objects; and then restrict the occurrences according to the criterion that attribute A of object X is smaller than attribute B of object Y. 
     The data flow builder, recognizing that SEQ provides very little functionality, first sets up a generate node 132. Its roles are to trigger the detailed call needed to retrieve successive occurrences of attributes B and C of object Y from SEQ, over line 134; to receive the value back over line 136; and to pass it on line 136 to the next higher node 138. The generate node receives the arguments (object Y, attributes C) from node 130 via line 140. Recognizing that the SQL data base is able to perform its own retrievals based on fairly high-level queries, the data flow builder places a lossy --  join node 138 as shown. Its purposes are (a) to provide a fairly high-level request on line 144 to SQL data base Q 127 to fetch an occurrence of attributes A and C in object X, (b) to receive back the fetched occurrence, (c) to combine it with the corresponding occurrences of attribute C in object Y, in accordance with the lossy --  join function, and (d) to pass the resulting stream to the next higher node 140. Lossy --  join node 138 receives the arguments (object X, attributes A, C) from node 130 over line 146. 
     The restrict node 140, screens the combine stream received from node 138 to exclude any occurrences for which the value of attribute A is not smaller than the value of attribute B. 
     It should now be apparent that the data flow builder, in a manner entirely transparent to the user or developer, structures the external data base calls in a manner which delegates to data bases functions which they are able to perform, while having the data flow evaluator perform data base type functions which a given data base is not able to perform. The developer or user need only refer to the stored objects by name and may structure rules and queries in a uniform manner without regard to where the objects are stored. 
     The functions of the data flow evaluator are (a) to execute the steps of the data flow network, (b) to convert retrieved occurrences to a form usable by KBMS, (c) to determine when an occurrence retrieved from a data base should be transduced (stored) in the knowledge data base of KBMS, (d) to perform the transduction, (e) to perform transduction filtering, (f) to perform cursor control with respect to the external data bases, (g) to optimize the retrieval of key specified occurrences, (h) to manage the storage of occurrences back in the data base, (i) to synchronize uses that KBMS makes of external data base occurrences with the state of those occurrences in the external data base, and (j) to execute any other steps required by the data flow network. 
     These functions of the data flow evaluator are carried out in a manner which further helps to minimize the overhead spent on and improve the efficiency of external data base retrievals. 
     Referring to FIG. 18, in a typical external data base 42, occurrences are stored as records 320 in names files 322. A cursor facility 324 is normally provided to point to a record of current interest within a file. The inference engine 16 in KBMS is arranged to deal with occurrences in objects only after they have been stored in the local, flexible, high-speed storage provided by the knowledge data base 22. 
     In particular, KDB 22 includes a permanent memory space 326 where values entered by the developer are stored and a temporary memory space 328 for storing values which are of temporary interest during a user session, i.e., values entered by the user and values retrieved from the data base. 
     The process of copying an occurrence retrieved from a data base into the KDB temporary memory space 328 is called transduction. 
     One general principle of operation of the data flow evaluator is to perform transduction at the latest possible stage in the data base retrieval process in order to minimize the volume of information stored in the temporary memory space. Thus, referring again to FIG. 17, the data flow evaluator would first execute the generate node, lossy --  join node, and restrict node, before transducing the occurrences delivered from the restrict node into temporary memory space. Because the restrict and lossy --  join nodes act as filters (to data flow and data base streams respectively) which reduce the remaining number of occurrences, the number of occurrences that become stored in the temporary memory space is minimized. 
     An exception to this principle of delayed transduction concerns retrievals of key specified occurrences. When the data flow evaluator encounters a request for such a retrieval, it retrieves all attributes of the named occurrence at once and immediately transduces them into temporary memory space. By nature, key occurrences tend to be referred to several times in succession. By immediately transducing the entire occurrence, because there is only one occurrence matching a key search specification, later references to that occurrence can be served immediately, without returning to the external data base, simply by having the data flow evaluator check the temporary memory space to see if the key occurrence is already there. 
     Cursor control by the data flow evaluator provides efficient use of occurrences stored in an external data base in executing Rete network nodes of the kind, for example, that require scanning through a range of occurrences in an object to find the ones that satisfy a specified test. In executing such a node, the inferencing engine typically will ask the data flow handles for one occurrence that satisfies the test. The data flow handler will find one (using the transduction filtering described above), transduce it into the temporary memory space, and so inform the inference engine. The inference engine will then ask for another occurrence and the process repeats until all occurrences meeting the test have been transduced. For the data base handler to serve such inferencing engine requests effectively, it needs to be able to set and reset the cursor in the data base to successive occurrences. The cursor in effect enables the data base handler to keep track of where it is within an object. 
     Cursor control is handled as follows. During the original data flow network compilation process, whenever a node is compiled which involves a request to an external data base, the data flow handler generates a sequence of data base call instruction designed to initialize the cursor at the beginning of the relevant object and to provide the data base handler with the cursor value (place marker). 
     At run time, when the node is encountered, the cursor value is initialized. Thereafter, each time the next occurrence in a data base record is fetched, the cursor value is incremented by the data base evaluator and is used to point to the next needed occurrence in the object. After fetching the final occurrence in the object, the data flow evaluator terminates the cursor by sending appropriate commands to the external data base&#39;s manager. 
     In addition, the network compiler insists that each data base request transduce the entire list of attributes needed by all network requests for that data base object. That is, each request when transducing an instance will transduce enough information (attributes) to service any other request in the network. 
     When a value is assigned to an attribute of a data base object, the value of the attribute in the data base is not immediately changed, but rather the replica stored in KDB is changed. Since it is common to assign values to more than one attribute of a data base object in a rule, each assignment is made to the replica without changing the data base occurrence, in an attempt to accumulate enough work to make the conversation with the data base during data base update worthwhile. All assignments to the data base attributes in the right hand side of a rule are performed without data base update. At the end of the rule action sequence, the data base replica needs to be synchronized with the data base occurrence. 
     It is possible (and for some purposes useful) to update the replica of a data base occurrence without updating the data base occurrence itself. The modified replica will propagate through the network with the new value causing whatever ensuing activity that the rules require. Used in this way, the replica can be thought of as a set of local variables available for calculation. The other alternative is to update the data base occurrence with the modified values of the replica. This is accomplished with a SYNC action. The SYNC action takes a list (possibly empty) of object names as arguments and flushes any modified values of the replica bound at the time of the SYNC action to the corresponding occurrences in the data base. If the list of object names is empty, then all data base objects assigned to in the right hand side action sequence are flushed to the data base. For each object name, a SYNC action flushes values for one replica. A SYNC action thus must be applied to each replica to be flushed to the data base. At compile time, a set of data base update requests is prepared for each SYNC action. During SYNC invocation, the unique key of the replica is used to obtain the corresponding data base occurrence, and the modified replica attributes are updated in the data base. So that the rule writer need not append SYNC actions to all assignments of values to data base attributes, a switch is available that ensures automatic data base synchronization at the end of every rule that updates a data base object. 
     Most data bases require a designation of the end of a unit of work. This can be handled implicitly or explicitly in KBMS. Implicitly KBMS automatically commits any data base work performed during a session upon exit from the session. Explicit COMMIT and ROLLBACK actions may also be used to, respectively, COMMIT all data bases or ROLLBACK all data bases. 
     In cases when the Rete network node specifies an action that requires returning an occurrence to an external data base, there is an issue as to when and how the delivery of the occurrence should be made. Typically external data bases have facilities which enable a lock to be requested at the same time that an occurrence is being fetched. The data base manager applies the lock to that occurrence to prevent action on any other request for that occurrence. Later when the original requester returns the (possibly revised) occurrence to the data base, the lock is released. 
     In the present invention, the data flow evaluator does not request a lock. Instead, when an occurrence is to be returned to a data base, the data flow evaluator first fetches the occurrence again from the data base and compares its value with the values of the occurrence as originally fetched. If discrepancies are found, these are identified and reported to the user. Otherwise, any required modifications stored locally in the temporary memory space are made to the occurrence, and it is written back to the data base. 
     Referring to FIG. 19, the facility which enables KBMS to accept and act on attribute values and queries received from a COBOL program, includes a preprocessor which reviews the COBOL program and when it finds SQL-type statements, substitutes subroutine-type calls which provide a mechanism by which the attribute values and queries and response may be passed via a communication link 330 between KBMS 12 and the application software 24. The attribute values and queries form the COBOL program do not merely trigger a retrieval of requested occurrences from an SQL data base; that is, the KBMS does not merely pass the attribute values and queries through to an SQL data base. Instead, the SQL-type statements serve as a mechanism for invoking the full operation of the inferencing engine using objects stored either in KDB or an external data base. Note that there need not be an external data base at all, and in that case the COBOL programmer need not be aware that he is not actually using an SQL data base. 
     In general, an SQL-type query to a data base may include assertions of attribute values (e.g., by an INSERT statement) which KBMS applies to the top of the Rete network, just as any other attribute value occurring during a run is entered into the Rete network. Those assertions may trigger calls to an external data base and, ultimately, may result in an action being placed on the agenda. The action may involve sending back a response to the COBOL program. The KBMS may also request additional information from the COBOL program. Thus, as an example, a COBOL program designed to generate an order for parts could send to KBMS a skeletal order listing a customer&#39;s name and three part numbers and KBMS could expand the skeletal order into a complete order and return it to the COBOL program. 
     Other SQL-type statements that are serviced by KBMS include UPDATE and DELETE. The normal function of UPDATE is to update a data base field or column with a value; KBMS executes the statement by passing the attribute and value to the inference engine for assertion in a set of inference rules in the knowledge base system. DELETE is executed by passing the occurrence to the inference engine for assertion of the deletion in the inference rules of the knowledge base system. 
     An example of a COBOL program with embedded SQL statements is set forth in Appendix A and the same program, with the subroutine calls inserted by the preprocessor, is set forth in Appendix B. In Appendix A, each SQL command is preceded by EXEC AISQL and followed by END-EXEC. In Appendix B, AISQL-DA-STRUCT1 is the COBOL data storage area used for all information passing from COBOL to KBMS; AISQL-DA-STRUC2 is used in the other direction. 
     SQL statements in a COBOL program can be phrased in a form such that attribute values are specified and a query is phrased all in the same statement, for example, &#34;SELECT WINE FROM RECOMMENDATION WHERE ENTREE=`VEAL` of SAUCE=`TOMATO-BASED`&#34;. The statement both asserts values (veal and tomato-based) and requests a response (a wine recommendation). 
     Referring to FIG. 20, from the point of view of the data flow structure, this type of statement would translate into three nodes specifying two separate dataflow programs. The right most program consisting of the RHS node and the generate node are invoked first, assigning to the ENTREE and SAUCE attributes of a MEAL object. These assignments provide sufficient facts to allow the rules to determine and assign a WINE attribute of a RECOMMENDATION object. The second dataflow program consisting of the left most node is then invoked to retrieve the RECOMMENDATION and return it to the application COBOL program. 
     Other embodiments are within the following claims. ##SPC1##