Beispiel #1
0
def _search_cache(tx, alist_to_instantiate: Alist, attribute_to_instantiate,
                  search_attributes) -> (bool, list):
    alists = []
    conditions = ""
    resultStatus = False
    if not attribute_to_instantiate:
        return (resultStatus, [alist_to_instantiate])
    conditions = " AND ".join([
        f"n.{x}='{alist_to_instantiate.instantiation_value(x)}'"
        for x in search_attributes
    ])
    results = tx.run("MATCH (n:Alist)" f"WHERE {conditions}" "RETURN n")
    for node in results:
        if node[0]:
            try:
                alist = Alist(**node[0]._properties)
                if alist.is_instantiated(attribute_to_instantiate):
                    alist.set(
                        attribute_to_instantiate,
                        alist.instantiation_value(attribute_to_instantiate))
                    alist.attributes.pop('sessionId', None)
                    alist.attributes.pop('parentId', None)
                    alist.attributes.pop('src', None)
                    alists.append(alist)
                    resultStatus = True
            except:
                print("Error during alist creation from search result")
    return (resultStatus, alists)
Beispiel #2
0
 def test_isInstantiated2(self):
     alist = Alist(
         **{
             tt.ID: '1',
             tt.SUBJECT: 'Africa',
             tt.PROPERTY: 'P1082',
             tt.OBJECT: '?x',
             tt.TIME: '2010',
             tt.OPVAR: '?x',
             tt.COST: 1
         })
     alist.set('#d', 34)
     results = [
         alist.is_instantiated(tt.SUBJECT),
         alist.is_instantiated(tt.OBJECT),
         alist.is_instantiated('#d')
     ]
     self.assertEqual(results, [True, False, True],
                      "should result in list [True, False, True].")
Beispiel #3
0
 def test_isInstantiated(self):
     alist = Alist(
         **{
             tt.ID: '1',
             tt.SUBJECT: '$y',
             tt.PROPERTY: 'P1082',
             tt.OBJECT: '?x',
             tt.TIME: '2010',
             tt.OPVAR: '?x',
             tt.COST: 1,
             '$y': 'Ghana'
         })
     result = alist.is_instantiated(tt.SUBJECT)
     self.assertTrue(result)
Beispiel #4
0
    def run_frank(self, alist: Alist):
        """ Run the FRANK algorithm for an alist

        Args
        ----
        alist : Alist

        Return
        ------
        Return True if the instantiation of the project variable of an alist 
        is propagated to the root node.

        Notes
        -----
        For the given alist, attempt to instantiate projection 
        variable. If instantiation is successful, attempt to reduce
        Else decompose and add new children to queue
        """
        self.last_heartbeat = time.time()
        curr_propagated_alists = []
        self.max_depth = alist.depth
        if alist.state is states.PRUNED:
            self.write_trace(
                f"{pcol.RED}ignore pruned {alist.id}{pcol.RESET}-{alist}{pcol.RESETALL}"
            )
            return propagated_alists

        bool_result = False
        proj_vars = alist.projection_variables()
        proj_instantiated = True
        if proj_vars:
            for p, _ in proj_vars.items():
                proj_instantiated = proj_instantiated and alist.is_instantiated(
                    p)

        agg_vars = alist.get(tt.OPVAR).split(' ')
        agg_instantiated = True
        if agg_vars:
            for v in agg_vars:
                agg_instantiated = agg_instantiated and alist.is_instantiated(
                    v)
            if agg_instantiated:
                bool_result = True

        if bool_result:
            alist.state = states.REDUCIBLE
            self.G.add_alist(alist)
        # if OPVAR not instantiated, search KB
        elif not bool_result:
            bool_result = self.search_kb(alist)
        # search kb for the variable instantiation

        if bool_result:
            is_propagated = False
            if alist.state != states.REDUCIBLE:  # if in reducible state, don't change
                alist.state = states.EXPLORED
                self.G.add_alist(alist)
            if agg_instantiated and proj_instantiated:
                alist.state = states.REDUCIBLE
                self.G.add_alist(alist)
            if self.G.child_ids(alist.id):
                is_propagated = self.propagate(self.G.child_ids(alist.id)[0])
            else:
                is_propagated = self.propagate(
                    self.G.child_ids(self.G.parent_ids(alist.id)[0])[0])

            if is_propagated:
                prop_alist = self.G.alist(self.root.id)
                self.write_trace(
                    f"{pcol.CYAN}intermediate ans: "
                    f"{pcol.RESET}-{prop_alist}{pcol.RESETALL}",
                    loglevel=processLog.LogLevel.ANSWER)
                curr_propagated_alists.append(prop_alist.copy())
                self.propagated_alists.append(prop_alist.copy())
        else:
            alist.state = states.EXPLORED
            self.G.add_alist(alist)
            for mapOp in self.get_map_strategy(alist):
                self.decompose(alist, mapOp)
        return curr_propagated_alists