Skip to content

Commit 3345d2e

Browse files
Merge pull request #67 from KeithKelleher/main
add graphql interface for target graph
2 parents e6ff8ef + 1ada3bd commit 3345d2e

31 files changed

+984
-601
lines changed

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ cwltool
1414
snakemake
1515
pandas
1616
GEOparse
17-
graphene
1817
pyyaml
1918

2019
mgp

requirements.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ dependencies:
1818
- psycopg2
1919
- pandas
2020
- GEOparse
21-
- graphene
2221
- pyyaml
2322
- cwltool
2423
- snakemake

src/api_adapters/arango_api_adapter.py

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import networkx as nx
44

55
from src.interfaces.data_api_adapter import APIAdapter
6-
from src.interfaces.result_types import FacetQueryResult, CountQueryResult, ListQueryResult, DetailsQueryResult
6+
from src.interfaces.result_types import FacetQueryResult, CountQueryResult, ListQueryResult, DetailsQueryResult, \
7+
ResolveResult, LinkedListQueryResult, LinkDetails
78
from src.shared.arango_adapter import ArangoAdapter
89
from src.shared.db_credentials import DBCredentials
910

@@ -85,6 +86,12 @@ def _get_document_cleanup_clause(self, variable: str = 'doc'):
8586
UNSET({variable}, ["_key", "_id", "_rev", "_from", "_to"])
8687
"""
8788

89+
def _get_sortby_clause(self, sortby: dict):
90+
if not sortby:
91+
return ""
92+
clauses = [f"doc.{k} {v}" for k, v in sortby.items()]
93+
return "SORT " + ', '.join(clauses)
94+
8895
def get_facet_values(self, data_model: str, field: str, filter: dict = None, top: int = 20) -> FacetQueryResult:
8996
label = self.labeler.get_labels_for_class_name(data_model)[0]
9097
other_filter = {k: v for k, v in filter.items() if k != field} if filter else None
@@ -113,7 +120,7 @@ def get_count(self, data_model: str, filter: dict = None) -> CountQueryResult:
113120
result = self.runQuery(query)
114121
return CountQueryResult(query = query, count=result[0]) if result else CountQueryResult(query = query, count=0)
115122

116-
def get_list(self, data_model: str, filter: dict = None, top: int = 20, skip: int = 0) -> ListQueryResult:
123+
def get_list(self, data_model: str, filter: dict = None, top: int = 10, skip: int = 0) -> ListQueryResult:
117124
label = self.labeler.get_labels_for_class_name(data_model)[0]
118125
query = f"""
119126
FOR doc IN `{label}`
@@ -126,15 +133,76 @@ def get_list(self, data_model: str, filter: dict = None, top: int = 20, skip: in
126133
list = [self.convert_to_class(data_model, res) for res in result]
127134
return ListQueryResult(query = query, list=list) if result else ListQueryResult(query = query, list=[])
128135

136+
def get_linked_list(self, source_data_model: str, source_id: str,
137+
dest_data_model: str, dest_id: str,
138+
edge_model: str, filter: dict = None, top: int = 10, skip: int = 0) -> LinkedListQueryResult:
139+
source_label = self.labeler.get_labels_for_class_name(source_data_model)[0]
140+
dest_label = self.labeler.get_labels_for_class_name(dest_data_model)[0]
141+
edge_label = self.labeler.get_labels_for_class_name(edge_model)[0]
142+
if source_id is not None:
143+
id = self.safe_key(source_id)
144+
anchor_label = source_label
145+
query_label = dest_label
146+
query_model = dest_data_model
147+
direction = 'OUTBOUND'
148+
else:
149+
id = self.safe_key(dest_id)
150+
anchor_label = dest_label
151+
query_label = source_label
152+
query_model = source_data_model
153+
direction = 'INBOUND'
154+
155+
query = f"""
156+
FOR v, e IN 1..1 {direction} '{anchor_label}/{id}' GRAPH 'graph'
157+
OPTIONS {{ edgeCollections: ['{edge_label}'], vertexCollections: ['{query_label}'] }}
158+
LIMIT {skip}, {top}
159+
RETURN {{
160+
edge: {self._get_document_cleanup_clause('e')},
161+
node: {self._get_document_cleanup_clause('v')}
162+
}}
163+
"""
164+
results = self.runQuery(query)
165+
result_list = []
166+
for row in results:
167+
result_list.append(LinkDetails(
168+
node=self.convert_to_class(query_model, row['node']),
169+
edge=self.convert_to_class(edge_model, row['edge'])
170+
))
171+
return LinkedListQueryResult(query = query, list=result_list)
172+
173+
def resolve_id(self, data_model: str, id: str, sortby: dict = {}) -> ResolveResult:
174+
label = self.labeler.get_labels_for_class_name(data_model)[0]
175+
176+
query = f"""
177+
FOR doc IN `{label}`
178+
FILTER '{id}' IN doc.xref
179+
{self._get_sortby_clause(sortby)}
180+
LIMIT 11
181+
RETURN {self._get_document_cleanup_clause()}
182+
"""
183+
184+
result = self.runQuery(query)
185+
result_list = [self.convert_to_class(data_model, res) for res in result]
186+
187+
return ResolveResult(
188+
query = query,
189+
match=result_list[0] if result_list else None,
190+
other_matches=result_list[1:] if len(result_list) > 1 else None
191+
)
192+
129193
def get_details(self, data_model: str, id: str) -> DetailsQueryResult:
130194
label = self.labeler.get_labels_for_class_name(data_model)[0]
131195
query = f"""
132196
FOR doc IN `{label}`
133197
FILTER doc.id == '{id}'
198+
LIMIT 1
134199
RETURN {self._get_document_cleanup_clause()}
135200
"""
136201
result = self.runQuery(query)
137-
return DetailsQueryResult(query = query, details=list(result)[0]) if result else DetailsQueryResult(query = query, details={})
202+
result_list = [self.convert_to_class(data_model, res) for res in result]
203+
return DetailsQueryResult(query = query, details=result_list[0]) \
204+
if result \
205+
else DetailsQueryResult(query = query, details=None)
138206

139207
def get_edge_types(self, data_model: str):
140208
label = self.labeler.get_labels_for_class_name(data_model)[0]

src/api_adapters/graphene_utils.py

Lines changed: 0 additions & 75 deletions
This file was deleted.

0 commit comments

Comments
 (0)