|
41 | 41 | TARGET_VAR = Variable('target')
|
42 | 42 | ASK_VAR = Variable('ask')
|
43 | 43 | COUNT_VAR = Variable('count')
|
44 |
| - |
45 |
| - |
| 44 | +EDGE_VAR_COUNT = Variable('edge_count_var') |
| 45 | +NODE_VAR_COUNT = Variable('node_count_var') |
| 46 | +MAX_NODE_COUNT = Variable('maximum node count') |
| 47 | +PRIO_VAR = Variable('priority') |
46 | 48 | def gen_random_var():
|
47 | 49 | return Variable(RANDOM_VAR_PREFIX + ''.join(
|
48 | 50 | random.choice(string.ascii_letters + string.digits)
|
@@ -709,6 +711,90 @@ def to_count_var_over_values_query(self, var, vars_, values, limit):
|
709 | 711 | res += 'LIMIT %d\n' % limit
|
710 | 712 | return self._sparql_prefix(res)
|
711 | 713 |
|
| 714 | + def to_find_edge_var_for_narrow_path_query(self, edge_var, node_var, |
| 715 | + vars_, filter_node_count, |
| 716 | + filter_edge_count, limit_res): |
| 717 | + """Counts possible substitutions for edge_var to get a narrow path |
| 718 | +
|
| 719 | + Meant to perform a query like this: |
| 720 | + SELECT * |
| 721 | + { |
| 722 | + { |
| 723 | + SELECT |
| 724 | + ?edge_var |
| 725 | + (COUNT(*) AS ?edge_var_count) |
| 726 | + (MAX(?node_var_count) AS ?max_node_count) |
| 727 | + (COUNT(*)/AVG(?node_var_count) as ?prio_var) |
| 728 | + { |
| 729 | + SELECT DISTINCT |
| 730 | + ?source ?target ?edge_var (COUNT(?node_var) AS ?node_var_count) |
| 731 | + { |
| 732 | + VALUES (?source ?target) { |
| 733 | + (dbr:Adolescence dbr:Youth) |
| 734 | + (dbr:Adult dbr:Child) |
| 735 | + (dbr:Angel dbr:Heaven) |
| 736 | + (dbr:Arithmetic dbr:Mathematics) |
| 737 | + } |
| 738 | + ?node_var ?edge_var ?source . |
| 739 | + ?source dbo:wikiPageWikiLink ?target . |
| 740 | + } |
| 741 | + } |
| 742 | + GROUP BY ?edge_var |
| 743 | + ORDER BY DESC(?edge_var_count) |
| 744 | + } |
| 745 | + FILTER(?max_node_count < 10 && ?edge_var_count > 1) |
| 746 | + } |
| 747 | + ORDER BY DESC(?prio_var) |
| 748 | + LIMIT 32 |
| 749 | +
|
| 750 | + :param edge_var: Edge variable to find substitution for. |
| 751 | + :param node_var: Node variable to count. |
| 752 | + :param vars_: List of vars to fix values for (e.g. ?source, ?target). |
| 753 | + :param values: List of value lists for vars_. |
| 754 | + :param filter_node_count: Filter on node count of edge variable. |
| 755 | + :param filter_edge_count: Filter for edge count of triples. |
| 756 | + :param limit_res : limit result size |
| 757 | + :return: Query String. |
| 758 | + """ |
| 759 | + |
| 760 | + res = 'SELECT * WHERE {\n' |
| 761 | + res += ' {\n'\ |
| 762 | + ' SELECT %s (COUNT(*) as %s) (Max(%s) AS %s) ' \ |
| 763 | + ' (COUNT(*)/AVG(%s) AS %s) WHERE {\n' % ( |
| 764 | + edge_var.n3(), EDGE_VAR_COUNT.n3(), |
| 765 | + NODE_VAR_COUNT.n3(), MAX_NODE_COUNT.n3(), |
| 766 | + NODE_VAR_COUNT.n3(), PRIO_VAR.n3()) |
| 767 | + res += ' SELECT DISTINCT %s %s (COUNT(%s) AS %s) WHERE {\n' % ( |
| 768 | + ' '.join([v.n3() for v in vars_]), |
| 769 | + edge_var.n3(), node_var.n3(), NODE_VAR_COUNT.n3()) |
| 770 | + # res += self._sparql_values_part(values) |
| 771 | + res += 'VALUES(%s) {\n' \ |
| 772 | + '(dbr: Adolescence dbr: Youth)' \ |
| 773 | + '(dbr:Adult dbr:Child)' \ |
| 774 | + '(dbr:Angel dbr:Heaven)' \ |
| 775 | + '(dbr:Arithmetic dbr:Mathematics)' \ |
| 776 | + '}\n' % (' '.join([v.n3() for v in vars_])) |
| 777 | + # triples part |
| 778 | + tres = [] |
| 779 | + for s, p, o in self: |
| 780 | + tres.append('%s %s %s .' % (s.n3(), p.n3(), o.n3())) |
| 781 | + indent = ' ' * 3 |
| 782 | + triples = indent + ('\n' + indent).join(tres) + '\n' |
| 783 | + res += triples |
| 784 | + res += ' }\n'\ |
| 785 | + ' }\n' |
| 786 | + res += ' GROUP BY %s\n' % edge_var.n3() |
| 787 | + res += ' ORDER BY DESC(%s)\n' % EDGE_VAR_COUNT.n3() |
| 788 | + res += ' }\n' |
| 789 | + res += ' FILTER(%s < %d && %s > %d)\n' % (MAX_NODE_COUNT.n3(), |
| 790 | + filter_node_count, |
| 791 | + EDGE_VAR_COUNT.n3(), |
| 792 | + filter_edge_count) |
| 793 | + res += '}\n' |
| 794 | + res += 'ORDER BY DESC(%s)\n' % PRIO_VAR.n3() |
| 795 | + res += 'LIMIT %d' % limit_res |
| 796 | + return self._sparql_prefix(res) |
| 797 | + |
712 | 798 | def to_dict(self):
|
713 | 799 | return {
|
714 | 800 | 'fitness': self.fitness.values if self.fitness.valid else (),
|
|
0 commit comments