@@ -27,16 +27,18 @@ def __init__(self, node, node_id ,anonymous=False):
27
27
props = {}
28
28
curie_filters = []
29
29
curie = node .pop ("id" , None )
30
+ self .has_curie = False
30
31
if curie is not None :
31
- if isinstance (curie , str ):
32
- props ['id' ] = curie
32
+ if isinstance (curie , str ) or ( isinstance ( curie , list ) and len ( curie ) == 1 ) :
33
+ props ['id' ] = curie if isinstance ( curie , str ) else curie [ 0 ]
33
34
elif isinstance (curie , list ):
34
35
for ci in curie :
35
36
# generate curie-matching condition
36
37
curie_filters .append (f"{ name } .id = '{ ci } '" )
37
38
# union curie-matching filters together
38
39
else :
39
40
raise TypeError ("Curie should be a string or list of strings." )
41
+ self .has_curie = True
40
42
label_filters = []
41
43
if labels :
42
44
biolink_regex = "^biolink:[A-Z][a-zA-Z]*$"
@@ -48,22 +50,20 @@ def __init__(self, node, node_id ,anonymous=False):
48
50
else :
49
51
other_label = upgrade_BiolinkEntity (label )
50
52
label_filters .append (f"'{ other_label } ' in { name } .category" )
51
-
53
+ self . _filters = ''
52
54
if len (curie_filters ):
53
- filters = '( ' + ' OR ' .join (curie_filters ) + ') AND (' + ' OR ' .join (label_filters ) + ')'
54
- else :
55
- filters = ' OR ' .join (label_filters )
56
- self ._filters = filters
55
+ filters = '( ' + ' OR ' .join (curie_filters ) + ')'
56
+ self ._filters = filters
57
57
node .pop ('name' , None )
58
58
node .pop ('is_set' , False )
59
59
props .update (node )
60
60
61
61
self .name = name
62
62
self .labels = labels
63
63
self .prop_string = ' {' + ', ' .join ([f"`{ key } `: { cypher_prop_string (props [key ])} " for key in props ]) + '}'
64
- self ._filters = filters
65
64
if curie :
66
- self ._extras = '' #f' USING INDEX {name}:{labels[0]}(id)'
65
+ # redis graph doesnt support USING INDEX version 2.4.2
66
+ self ._extras = '' #f' USING INDEX {name}:`{labels[0]}`(id)'
67
67
else :
68
68
self ._extras = ''
69
69
self ._num = 0
@@ -72,7 +72,8 @@ def __str__(self):
72
72
"""Return the cypher node reference."""
73
73
self ._num += 1
74
74
if self ._num == 1 :
75
- return f'{ self .name } ' + f'{ self .prop_string } ' # + ''.join(f':`{label}`' for label in self.labels)
75
+ label = f':`{ self .labels [0 ]} `' if self .labels else ''
76
+ return f'{ self .name } ' + label + f'{ self .prop_string } ' # + ''.join(f':`{label}`' for label in self.labels)
76
77
return self .name
77
78
78
79
@property
@@ -129,6 +130,7 @@ def __init__(self, edge, edge_id, anonymous=False):
129
130
self ._filters = filters
130
131
has_type = 'predicate' in edge and edge ['predicate' ]
131
132
self .directed = edge .get ('directed' , has_type )
133
+ self .reversed = False
132
134
133
135
def __str__ (self ):
134
136
"""Return the cypher edge reference."""
@@ -139,7 +141,7 @@ def __str__(self):
139
141
else :
140
142
innards = self .name
141
143
if self .directed :
142
- return f'-[{ innards } ]->'
144
+ return f'-[{ innards } ]->' if not self . reversed else f'<-[ { innards } ]-'
143
145
else :
144
146
return f'-[{ innards } ]-'
145
147
@@ -176,17 +178,24 @@ def flatten(l):
176
178
match_strings [- 1 ] += node_references [n ].extras
177
179
if node_references [n ].filters :
178
180
match_strings .append ("WHERE " + node_references [n ].filters )
181
+ nodes_so_far = []
179
182
for n in nodes_with_id :
180
183
match_strings .append (f"MATCH ({ node_references [n ]} )" )
181
- match_strings .append ("WHERE " + node_references [n ].filters )
182
- match_strings .append (f"WITH { n } " )
184
+ if node_references [n ].filters :
185
+ match_strings .append ("WHERE " + node_references [n ].filters )
186
+ nodes_so_far .append (n )
187
+ match_strings .append (f"WITH { ', ' .join (nodes_so_far )} " )
183
188
184
189
# match edges
185
190
for edge_id , eref in edge_references .items ():
186
191
e = edges [edge_id ]
187
192
source_node = node_references [e ['subject' ]]
188
193
target_node = node_references [e ['object' ]]
189
- match_strings .append (f"MATCH ({ source_node } ){ eref } ({ target_node } )" )
194
+ if target_node .has_curie and not source_node .has_curie :
195
+ eref .reversed = True
196
+ match_strings .append (f"MATCH ({ target_node } ){ eref } ({ source_node } )" )
197
+ else :
198
+ match_strings .append (f"MATCH ({ source_node } ){ eref } ({ target_node } )" )
190
199
match_strings [- 1 ] += source_node .extras + target_node .extras
191
200
filters = [f'({ c } )' for c in [source_node .filters , target_node .filters , eref .filters ] if c ]
192
201
if max_connectivity > - 1 :
0 commit comments