2323logger .info ('init' )
2424
2525
26- # FIXME: properties as subject / object!
27-
2826def pattern_generator (
29- length , loops = True , p_connected = True , exclude_isomorphic = True ):
27+ length ,
28+ loops = True ,
29+ node_edge_joint = True ,
30+ p_connected = True ,
31+ exclude_isomorphic = True ,
32+ ):
3033 canonicalized_patterns = {}
31- possible_var_nodes = [Variable ('n%d' % i ) for i in range (length - 1 )]
32- possible_nodes = possible_var_nodes + [SOURCE_VAR , TARGET_VAR ]
33- possible_edges = [Variable ('e%d' % i ) for i in range (length )]
34+
35+ # To be connected there are max 3 + 2 + 2 + 2 + ... vars for the triples.
36+ # The first can be 3 different ones (including ?source and ?target, then
37+ # in each of the following triples at least one var has to be an old one
38+ possible_vars = [Variable ('v%d' % i ) for i in range ((2 * length ) - 1 )]
39+ possible_vars += [SOURCE_VAR , TARGET_VAR ]
3440
3541 possible_triples = [
3642 (s , p , o )
37- for s in possible_nodes
38- for p in possible_edges
39- for o in possible_nodes
43+ for s in possible_vars
44+ for p in possible_vars
45+ for o in possible_vars
4046 ]
4147
4248 n_patterns = binom (len (possible_triples ), length )
@@ -53,15 +59,16 @@ def pattern_generator(
5359 logger .debug (
5460 'excluded %d: source or target missing: %s' , pid , gp )
5561 continue
56- nodes = sorted (gp .nodes - {SOURCE_VAR , TARGET_VAR })
57- edges = sorted (gp .edges )
62+ vars_ = sorted (gp .vars_in_graph - {SOURCE_VAR , TARGET_VAR })
5863
5964 # check there are no skipped nodes, e.g., link to n2 picked but no n1
60- if nodes != possible_var_nodes [:len (nodes )]:
61- logger .debug ('excluded %d: skipped node : %s' , pid , gp )
65+ if vars_ != possible_vars [:len (vars_ )]:
66+ logger .debug ('excluded %d: skipped var : %s' , pid , gp )
6267 continue
63- if edges != possible_edges [:len (edges )]:
64- logger .debug ('excluded %d: skipped edge: %s' , pid , gp )
68+
69+ # check if nodes and edges are disjoint
70+ if not node_edge_joint and (gp .nodes & gp .edges ):
71+ logger .debug ('excluded %d: node-edge-joined: %s' , pid , gp )
6572 continue
6673
6774 # check for loops if necessary
@@ -101,10 +108,10 @@ def pattern_generator(
101108
102109
103110def main ():
104- length = 5
105- # 3: 702 of 17296
106- # 4: 16473 of 3921225
107- # 5: of 1488847536
111+ length = 3
112+ # 3: 47478 (pcon, nej) of 6666891
113+ # 4:
114+ # 5:
108115
109116 gen_patterns = []
110117 for n , (i , pattern ) in enumerate (pattern_generator (length )):
0 commit comments