(d)
| 292 | return query_expr, denotation |
| 293 | |
| 294 | def try_relation(d): |
| 295 | ent_list = set() |
| 296 | rel_list = set() |
| 297 | denorm_sexpr = d.split(' ') |
| 298 | for item in denorm_sexpr: |
| 299 | if item.startswith('m.'): |
| 300 | ent_list.add(item) |
| 301 | elif '.' in item: |
| 302 | rel_list.add(item) |
| 303 | ent_list = list(ent_list) |
| 304 | rel_list = list(rel_list) |
| 305 | cand_rels = set() |
| 306 | for ent in ent_list: |
| 307 | in_rels, out_rels, _ = get_2hop_relations_with_odbc_wo_filter(ent) |
| 308 | cand_rels = cand_rels | set(in_rels) | set(out_rels) |
| 309 | cand_rels = list(cand_rels) |
| 310 | if len(cand_rels) == 0 or len(rel_list) == 0: |
| 311 | return d.replace('( ','(').replace(' )', ')'), [] |
| 312 | similarities = model.similarity(rel_list, cand_rels) |
| 313 | change = dict() |
| 314 | for i, rel in enumerate(rel_list): |
| 315 | merged_list = list(zip(cand_rels, similarities[i])) |
| 316 | sorted_list = sorted(merged_list, key=lambda x: x[1], reverse=True) |
| 317 | change_rel = [] |
| 318 | for s in sorted_list: |
| 319 | if s[1] > 0.01: |
| 320 | change_rel.append(s[0]) |
| 321 | change[rel] = change_rel[:15] |
| 322 | for i, item in enumerate(denorm_sexpr): |
| 323 | if item in rel_list: |
| 324 | denorm_sexpr[i] = change[item] |
| 325 | combinations = [list(comb) for comb in itertools.islice(itertools.product(*[item if isinstance(item, list) else [item] for item in denorm_sexpr]),10000)] |
| 326 | exprs = [" ".join(s) for s in combinations][:4000] |
| 327 | query_exprs = [d.replace('( ','(').replace(' )', ')') for d in exprs] |
| 328 | for query_expr in query_exprs: |
| 329 | try: |
| 330 | # invalid sexprs, may leads to infinite loops |
| 331 | if 'OR' in query_expr or 'WITH' in query_expr or 'PLUS' in query_expr: |
| 332 | denotation = [] |
| 333 | else: |
| 334 | sparql_query = lisp_to_sparql(query_expr) |
| 335 | denotation = execute_query_with_odbc(sparql_query) |
| 336 | denotation = [res.replace("http://rdf.freebase.com/ns/",'') for res in denotation] |
| 337 | if len(denotation) == 0 : |
| 338 | |
| 339 | ents = set () |
| 340 | |
| 341 | for item in sparql_query.replace('(', ' ( ').replace(')', ' ) ').split(' '): |
| 342 | if item.startswith("ns:m."): |
| 343 | ents.add(item) |
| 344 | addline = [] |
| 345 | for i, ent in enumerate(list(ents)): |
| 346 | addline.append(f'{ent} rdfs:label ?en{i} . ') |
| 347 | addline.append(f'?ei{i} rdfs:label ?en{i} . ') |
| 348 | addline.append(f'FILTER (langMatches( lang(?en{i}), "EN" ) )') |
| 349 | sparql_query = sparql_query.replace(ent, f'?ei{i}') |
| 350 | clauses = sparql_query.split('\n') |
| 351 | for i, line in enumerate(clauses): |
no test coverage detected