我在Python 3.7.2上使用gremlinpython 3.4.1,并且在获得顶点/边缘响应时,它为ID提供<T.id: >
,为标签提供<T.label: 3>
。我如何获取它以在响应中提供id和label的字符串值呢?我的目的是获取输出并生成JSON
输出:
python3 stackoverflow.py
[{'name': ['USA'], 'parentname': ['USA'], 'shortname': ['US'], <T.id: 1>: 'country-us', 'parentid': ['country-us'], <T.label: 3>: 'Country'}]
代码:
from gremlin_python import statics
from gremlin_python.process.anonymous_traversal import traversal
from gremlin_python.process.graph_traversal import __
from gremlin_python.process.strategies import *
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from gremlin_python.process.traversal import T
from gremlin_python.process.traversal import Order
from gremlin_python.process.traversal import Cardinality
from gremlin_python.process.traversal import Column
from gremlin_python.process.traversal import Direction
from gremlin_python.process.traversal import Operator
from gremlin_python.process.traversal import P
from gremlin_python.process.traversal import Pop
from gremlin_python.process.traversal import Scope
from gremlin_python.process.traversal import Barrier
from gremlin_python.process.traversal import Bindings
from gremlin_python.process.traversal import WithOptions
CLUSTER_ENDPOINT = "removed"
PORT = "8182"
g = traversal().withRemote(DriverRemoteConnection('wss://' + CLUSTER_ENDPOINT + ':' + PORT + '/gremlin','g'))
response = g.V().has('name', 'USA').limit(1000).hasLabel('Country').valueMap(True).toList()
print(response)
顺便说一句-我尝试使用.with_(WithOptions.ids)
例如:
response = g.V().has('name', 'USA').limit(1000).hasLabel('Country').valueMap(True).with_(WithOptions.ids).toList()
我收到以下错误:
gremlin_python.driver.protocol.GremlinServerError: 599: {"requestId":"bf74df44-f064-4411-a1cb-78b30f9d2cf6","code":"InternalFailureException","detailedMessage":"Could not locate method: NeptuneGraphTraversal.with([1])"}
答案 0 :(得分:1)
此外,对于已经给出的project()
示例,如果您不能或不想指定属性名称,则可以执行以下操作:
g.V().has('name', 'USA').limit(1000).hasLabel('Country').
map(union(project('id','label').
by(id).
by(label),
valueMap()).unfold().
group().
by(keys).
by(select(values))) // select(values).unfold() if you only have single values
答案 1 :(得分:0)
您可以尝试project
结果。
g.V().has('name', 'USA').limit(1000).hasLabel('Country') \
.project('id', 'label', 'name', 'parentname', 'shortname', 'parentid') \
.by(id) \
.by(label) \
.by('name') \
.by('parentname') \
.by('shortname') \
.by('parentid') \
.toList()
答案 2 :(得分:0)
您可以将EnumMeta dict键替换为实际值。您需要在valueMap之后添加一个unfold()才能使用此功能。
from gremlin_python.process.traversal import T
def get_query_result_without_enum_metas(query_result):
return [replace_enum_metas(d) for d in query_result]
def replace_enum_metas(dict):
dict_key = (*dict,)[0]
if type(dict_key) is str:
return dict
elif type(dict_key) is T:
return {dict_key.name: dict[dict_key]}
input: [{'vertex_property': ['Summary']}, {<T.id: 1>: '4b30f448ee2527204a050596b'}, {<T.label: 3>: 'VertexLabel'}]
output: [{'vertex_property': ['Summary']}, {'id': '4b30f448ee2527204a050596b'}, {'label': 'VertexLabel'}]