hugegraph-python-client/src/pyhugegraph/api/graph.py (186 lines of code) (raw):
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import json
from typing import Optional, List
from pyhugegraph.api.common import HugeParamsBase
from pyhugegraph.structure.edge_data import EdgeData
from pyhugegraph.structure.vertex_data import VertexData
from pyhugegraph.utils import huge_router as router
from pyhugegraph.utils.exceptions import NotFoundError
class GraphManager(HugeParamsBase):
@router.http("POST", "graph/vertices")
def addVertex(self, label, properties, id=None):
data = {}
if id is not None:
data["id"] = id
data["label"] = label
data["properties"] = properties
if response := self._invoke_request(data=json.dumps(data)):
return VertexData(response)
return None
@router.http("POST", "graph/vertices/batch")
def addVertices(self, input_data):
data = []
for item in input_data:
data.append({"label": item[0], "properties": item[1]})
if response := self._invoke_request(data=json.dumps(data)):
return [VertexData({"id": item}) for item in response]
return None
@router.http("PUT", 'graph/vertices/"{vertex_id}"?action=append')
def appendVertex(self, vertex_id, properties): # pylint: disable=unused-argument
data = {"properties": properties}
if response := self._invoke_request(data=json.dumps(data)):
return VertexData(response)
return None
@router.http("PUT", 'graph/vertices/"{vertex_id}"?action=eliminate')
def eliminateVertex(self, vertex_id, properties): # pylint: disable=unused-argument
data = {"properties": properties}
if response := self._invoke_request(data=json.dumps(data)):
return VertexData(response)
return None
@router.http("GET", 'graph/vertices/"{vertex_id}"')
def getVertexById(self, vertex_id): # pylint: disable=unused-argument
if response := self._invoke_request():
return VertexData(response)
return None
def getVertexByPage(self, label, limit, page=None, properties=None):
path = "graph/vertices?"
para = ""
para = para + "&label=" + label
if properties:
para = para + "&properties=" + json.dumps(properties)
if page:
para += f"&page={page}"
else:
para += "&page"
para = para + "&limit=" + str(limit)
path = path + para[1:]
if response := self._sess.request(path):
res = [VertexData(item) for item in response["vertices"]]
next_page = response["page"]
return res, next_page
return None, None
def getVertexByCondition(self, label="", limit=0, page=None, properties=None):
path = "graph/vertices?"
para = ""
if label:
para = para + "&label=" + label
if properties:
para = para + "&properties=" + json.dumps(properties)
if limit > 0:
para = para + "&limit=" + str(limit)
if page:
para += f"&page={page}"
else:
para += "&page"
path = path + para[1:]
if response := self._sess.request(path):
return [VertexData(item) for item in response["vertices"]]
return None
@router.http("DELETE", 'graph/vertices/"{vertex_id}"')
def removeVertexById(self, vertex_id): # pylint: disable=unused-argument
return self._invoke_request()
@router.http("POST", "graph/edges")
def addEdge(self, edge_label, out_id, in_id, properties) -> Optional[EdgeData]:
data = {
"label": edge_label,
"outV": out_id,
"inV": in_id,
"properties": properties,
}
if response := self._invoke_request(data=json.dumps(data)):
return EdgeData(response)
return None
@router.http("POST", "graph/edges/batch")
def addEdges(self, input_data) -> Optional[List[EdgeData]]:
data = []
for item in input_data:
data.append(
{
"label": item[0],
"outV": item[1],
"inV": item[2],
"outVLabel": item[3],
"inVLabel": item[4],
"properties": item[5],
}
)
if response := self._invoke_request(data=json.dumps(data)):
return [EdgeData({"id": item}) for item in response]
return None
@router.http("PUT", "graph/edges/{edge_id}?action=append")
def appendEdge(
self, edge_id, properties # pylint: disable=unused-argument
) -> Optional[EdgeData]:
if response := self._invoke_request(
data=json.dumps({"properties": properties})
):
return EdgeData(response)
return None
@router.http("PUT", "graph/edges/{edge_id}?action=eliminate")
def eliminateEdge(
self, edge_id, properties # pylint: disable=unused-argument
) -> Optional[EdgeData]:
if response := self._invoke_request(
data=json.dumps({"properties": properties})
):
return EdgeData(response)
return None
@router.http("GET", "graph/edges/{edge_id}")
def getEdgeById(
self, edge_id # pylint: disable=unused-argument
) -> Optional[EdgeData]:
if response := self._invoke_request():
return EdgeData(response)
return None
def getEdgeByPage(
self,
label=None,
vertex_id=None,
direction=None,
limit=0,
page=None,
properties=None,
):
path = "graph/edges?"
para = ""
if vertex_id:
if direction:
para = para + '&vertex_id="' + vertex_id + '"&direction=' + direction
else:
raise NotFoundError("Direction can not be empty.")
if label:
para = para + "&label=" + label
if properties:
para = para + "&properties=" + json.dumps(properties)
if page:
para += f"&page={page}"
else:
para += "&page"
if limit > 0:
para = para + "&limit=" + str(limit)
path = path + para[1:]
if response := self._sess.request(path):
return [EdgeData(item) for item in response["edges"]], response["page"]
return None, None
@router.http("DELETE", "graph/edges/{edge_id}")
def removeEdgeById(self, edge_id) -> dict: # pylint: disable=unused-argument
return self._invoke_request()
def getVerticesById(self, vertex_ids) -> Optional[List[VertexData]]:
if not vertex_ids:
return []
path = "traversers/vertices?"
for vertex_id in vertex_ids:
path += f'ids="{vertex_id}"&' # pylint: disable=consider-using-join
path = path.rstrip("&")
if response := self._sess.request(path):
return [VertexData(item) for item in response["vertices"]]
return None
def getEdgesById(self, edge_ids) -> Optional[List[EdgeData]]:
if not edge_ids:
return []
path = "traversers/edges?"
for vertex_id in edge_ids:
path += f"ids={vertex_id}&" # pylint: disable=consider-using-join
path = path.rstrip("&")
if response := self._sess.request(path):
return [EdgeData(item) for item in response["edges"]]
return None