diff --git a/sg-backend/db.py b/sg-backend/db.py index 7fd09f9c8e96078d1214422c597b3ce95622d2bd..f5a1c7b67b66b1e0d2f9031fba66b4fd0466cf06 100644 --- a/sg-backend/db.py +++ b/sg-backend/db.py @@ -50,4 +50,15 @@ class Neo4j: return [node for node in data[0]['p'] if type(node) is dict] # [node._properties.get('name') for node in results.graph().nodes] else: - return [] \ No newline at end of file + return [] + + def get_relations(self): + with self.driver.session() as session: + results = session.run("MATCH p = (a)-[r]->(b) RETURN a.name as source,b.name as target, r as relation_type") + return results.data() + + def get_nodes(self): + with self.driver.session() as session: + results = session.run("MATCH (a) return Id(a) as key, a.name as name") + return results.data() + diff --git a/sg-backend/main.py b/sg-backend/main.py index a26bc68a709c971951e0536a0873430a44ada222..756d205f2bdcccce171bf83328864ce39a8f398c 100644 --- a/sg-backend/main.py +++ b/sg-backend/main.py @@ -1,5 +1,6 @@ import json import os +import random from fastapi import FastAPI from pydantic import BaseModel @@ -51,8 +52,42 @@ async def software(): return {"softwares": json.loads(json.dumps(results))} +@app.get("/software-graph") +async def software(): + nodes = driver.get_nodes() + jnodes = json.loads(json.dumps(nodes)) + relations = driver.get_relations() + jrelations = json.loads(json.dumps(relations)) + + jsondata = {"nodes": jnodes, "edges": jrelations} + + def findNodeIdWithName(nodes, name): + for node in nodes: + if node["name"] == name: + return node["key"] + return 0 + + for idx, relation in enumerate(jsondata["edges"]): + relation['key'] = str(idx) + relation['attributes'] = {} + relation['attributes']['label'] = relation['relation_type'][1] + relation['source'] = findNodeIdWithName(jsondata["nodes"], relation["source"]) + relation['target'] = findNodeIdWithName(jsondata["nodes"], relation["target"]) + del relation['relation_type'] + + for node in jsondata["nodes"]: + node['attributes'] = {} + node['attributes']['label'] = node['name'] + node['attributes']['x'] = random.random() + node['attributes']['y'] = random.random() + node['attributes']['size'] = 22 + del node['name'] + + return jsondata + + @app.post("/software-search") async def software_search(search: SoftwareSearch): print(search.software1, search.software2) res = driver.get_softwares_shortest_path(search) - return {"softwares": res} \ No newline at end of file + return {"softwares": res}