Skip to content

Commit

Permalink
neighbor search includes results from metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
ygina committed Dec 8, 2016
1 parent 789fc98 commit e095c60
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 3 deletions.
27 changes: 24 additions & 3 deletions algebra.py
Expand Up @@ -186,9 +186,16 @@ def neighbor_search(self,
self._general_to_field_drs(i_drs)

# Check neighbors
for h in i_drs:
hits_drs = self._network.neighbors_id(h, relation)
o_drs = o_drs.absorb(hits_drs)
if not relation.from_metadata():
for h in i_drs:
hits_drs = self._network.neighbors_id(h, relation)
o_drs = o_drs.absorb(hits_drs)
else:
md_relation = self._relation_to_mdrelation(relation)
for h in i_drs:
neighbors = self.md_search(h, md_relation)
hits_drs = self._network.md_neighbors_id(h, neighbors, relation)
o_drs = o_drs.absorb(hits_drs)
return o_drs

"""
Expand Down Expand Up @@ -465,6 +472,20 @@ def _mdrelation_to_str(self, md_relation: MDRelation):
}
return ref_table[md_relation]

def _relation_to_mdrelation(self, relation):
if relation == Relation.MEANS_SAME:
return MDRelation.MEANS_SAME_AS
if relation == Relation.MEANS_DIFF:
return MDRelation.MEANS_DIFF_FROM
if relation == Relation.SUBCLASS:
return MDRelation.IS_SUBCLASS_OF
if relation == Relation.SUPERCLASS:
return MDRelation.IS_SUPERCLASS_OF
if relation == Relation.MEMBER:
return MDRelation.IS_MEMBER_OF
if relation == Relation.CONTAINER:
return MDRelation.IS_CONTAINER_OF

def _assert_same_mode(self, a: DRS, b: DRS) -> None:
error_text = ("Input parameters are not in the same mode ",
"(fields, table)")
Expand Down
15 changes: 15 additions & 0 deletions api/apiutils.py
Expand Up @@ -54,6 +54,15 @@ class Relation(Enum):
ENTITY_SIM = 3
PKFK = 5
INCLUSION_DEPENDENCY = 6
MEANS_SAME = 10
MEANS_DIFF = 11
SUBCLASS = 12
SUPERCLASS = 13
MEMBER = 14
CONTAINER = 15

def from_metadata(self):
return self.value >= 10


class OP(Enum):
Expand All @@ -67,6 +76,12 @@ class OP(Enum):
PKFK = 7
ENTITY_SIM = 8
ENTITY_LOOKUP = 9
MEANS_SAME = 10
MEANS_DIFF = 11
SUBCLASS = 12
SUPERCLASS = 13
MEMBER = 14
CONTAINER = 15


class Operation:
Expand Down
29 changes: 29 additions & 0 deletions knowledgerepr/fieldnetwork.py
Expand Up @@ -9,6 +9,7 @@
from api.apiutils import Hit
from api.apiutils import Relation
from api.apiutils import compute_field_id
from api.annotation import MRS


def build_hit(sn, fn):
Expand Down Expand Up @@ -192,6 +193,18 @@ def get_op_from_relation(self, relation):
return OP.TABLE
if relation == Relation.SCHEMA_SIM:
return OP.SCHEMA_SIM
if relation == Relation.MEANS_SAME:
return OP.MEANS_SAME
if relation == Relation.MEANS_DIFF:
return OP.MEANS_DIFF
if relation == Relation.SUBCLASS:
return OP.SUBCLASS
if relation == Relation.SUPERCLASS:
return OP.SUPERCLASS
if relation == Relation.MEMBER:
return OP.MEMBER
if relation == Relation.CONTAINER:
return OP.CONTAINER

def neighbors_id(self, hit: Hit, relation: Relation) -> DRS:
if isinstance(hit, Hit):
Expand All @@ -210,6 +223,22 @@ def neighbors_id(self, hit: Hit, relation: Relation) -> DRS:
o_drs = DRS(data, Operation(op, params=[hit]))
return o_drs

def md_neighbors_id(self, hit: Hit, md_neighbors: MRS, relation: Relation) -> DRS:
if isinstance(hit, Hit):
nid = str(hit.nid)
if isinstance(hit, str):
nid = hit
nid = str(nid)
data = []
score = 1.0 # TODO: return more meaningful score results
for hit in md_neighbors:
k = hit.target if hit.target != nid else hit.source
(db_name, source_name, field_name, data_type) = self.__id_names[k]
data.append(Hit(k, db_name, source_name, field_name, score))
op = self.get_op_from_relation(relation)
o_drs = DRS(data, Operation(op, params=[hit]))
return o_drs

def find_path_hit(self, source, target, relation, max_hops=5):

def assemble_field_path_provenance(o_drs, path, relation):
Expand Down

0 comments on commit e095c60

Please sign in to comment.