Skip to content

Commit 01eaffb

Browse files
committed
adds typings for nodes instead of category array lookup
1 parent 36e5ea3 commit 01eaffb

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

PLATER/services/util/drivers/redis_trapi_cypher_compiler.py

+23-14
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,18 @@ def __init__(self, node, node_id ,anonymous=False):
2727
props = {}
2828
curie_filters = []
2929
curie = node.pop("id", None)
30+
self.has_curie = False
3031
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]
3334
elif isinstance(curie, list):
3435
for ci in curie:
3536
# generate curie-matching condition
3637
curie_filters.append(f"{name}.id = '{ci}'")
3738
# union curie-matching filters together
3839
else:
3940
raise TypeError("Curie should be a string or list of strings.")
41+
self.has_curie = True
4042
label_filters = []
4143
if labels:
4244
biolink_regex = "^biolink:[A-Z][a-zA-Z]*$"
@@ -48,22 +50,20 @@ def __init__(self, node, node_id ,anonymous=False):
4850
else:
4951
other_label = upgrade_BiolinkEntity(label)
5052
label_filters.append(f"'{other_label}' in {name}.category")
51-
53+
self._filters = ''
5254
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
5757
node.pop('name', None)
5858
node.pop('is_set', False)
5959
props.update(node)
6060

6161
self.name = name
6262
self.labels = labels
6363
self.prop_string = ' {' + ', '.join([f"`{key}`: {cypher_prop_string(props[key])}" for key in props]) + '}'
64-
self._filters = filters
6564
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)'
6767
else:
6868
self._extras = ''
6969
self._num = 0
@@ -72,7 +72,8 @@ def __str__(self):
7272
"""Return the cypher node reference."""
7373
self._num += 1
7474
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)
7677
return self.name
7778

7879
@property
@@ -129,6 +130,7 @@ def __init__(self, edge, edge_id, anonymous=False):
129130
self._filters = filters
130131
has_type = 'predicate' in edge and edge['predicate']
131132
self.directed = edge.get('directed', has_type)
133+
self.reversed = False
132134

133135
def __str__(self):
134136
"""Return the cypher edge reference."""
@@ -139,7 +141,7 @@ def __str__(self):
139141
else:
140142
innards = self.name
141143
if self.directed:
142-
return f'-[{innards}]->'
144+
return f'-[{innards}]->' if not self.reversed else f'<-[{innards}]-'
143145
else:
144146
return f'-[{innards}]-'
145147

@@ -176,17 +178,24 @@ def flatten(l):
176178
match_strings[-1] += node_references[n].extras
177179
if node_references[n].filters:
178180
match_strings.append("WHERE " + node_references[n].filters)
181+
nodes_so_far = []
179182
for n in nodes_with_id:
180183
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)}")
183188

184189
# match edges
185190
for edge_id, eref in edge_references.items():
186191
e = edges[edge_id]
187192
source_node = node_references[e['subject']]
188193
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})")
190199
match_strings[-1] += source_node.extras + target_node.extras
191200
filters = [f'({c})' for c in [source_node.filters, target_node.filters, eref.filters] if c]
192201
if max_connectivity > -1:

version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.8
1+
1.9

0 commit comments

Comments
 (0)