23
23
logger .info ('init' )
24
24
25
25
26
- # FIXME: properties as subject / object!
27
-
28
26
def 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
+ ):
30
33
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 ]
34
40
35
41
possible_triples = [
36
42
(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
40
46
]
41
47
42
48
n_patterns = binom (len (possible_triples ), length )
@@ -53,15 +59,16 @@ def pattern_generator(
53
59
logger .debug (
54
60
'excluded %d: source or target missing: %s' , pid , gp )
55
61
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 })
58
63
59
64
# 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 )
62
67
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 )
65
72
continue
66
73
67
74
# check for loops if necessary
@@ -101,10 +108,10 @@ def pattern_generator(
101
108
102
109
103
110
def 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:
108
115
109
116
gen_patterns = []
110
117
for n , (i , pattern ) in enumerate (pattern_generator (length )):
0 commit comments