将gremlin查询结果与elementMap转换为JSON [gremlinpython 3.6.1]

2023-11-29

继续讨论自here.

我有一个提供路径列表以及 elementMap() 的查询。 如何将此数据转换为 JSON 以供其余代码使用。

我确实看过here谈到使用GraphSONMapper。 但是,我正在使用gremlinpython(v 3.6.1) 我找不到GraphSONMapper和 图书馆。有graphsonV2d0.py and graphsonV3d0.py,但不清楚如何使用它。

示例图:

g.addV('color-group').property(id,1).property(single, 'Color', 'primary').next()
g.addV('primary-color').property(id,2).property(single, 'Color', 'red').next()
g.addV('primary-color').property(id,3).property(single, 'Color', 'blue').next()
g.addV('primary-color').property(id,4).property(single, 'Color', 'yellow').next()
g.addV('secondary-color').property(id,5).property(single, 'Color', 'red-10').next()
g.V(1).addE('links').to(V(2)).property(single, 'Key', 'value').next()
g.V(1).addE('links').to(V(3)).property(single, 'Key', 'value').next()
g.V(1).addE('links').to(V(4)).property(single, 'Key', 'value').next()
g.V(4).addE('links').to(V(5)).property(single, 'Key', 'value').next()

Query:

 g.V().hasLabel('color-group').has('Color', 'primary').outE().inV().optional(outE().inV()).path().by(elementMap()).store('data').cap('data').next()

当前结果:

 [path[{<T.id: 1>: 1, <T.label: 4>: 'color-group', 'Color': 'primary'}, {<T.id: 1>: 7, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 2, <T.label: 4>: 'primary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 1, <T.label: 4>: 'color-group'}, 'Key': 'value'}, {<T.id: 1>: 2, <T.label: 4>: 'primary-color', 'Color': 'red'}], path[{<T.id: 1>: 1, <T.label: 4>: 'color-group', 'Color': 'primary'}, {<T.id: 1>: 8, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 3, <T.label: 4>: 'primary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 1, <T.label: 4>: 'color-group'}, 'Key': 'value'}, {<T.id: 1>: 3, <T.label: 4>: 'primary-color', 'Color': 'blue'}], path[{<T.id: 1>: 1, <T.label: 4>: 'color-group', 'Color': 'primary'}, {<T.id: 1>: 9, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 4, <T.label: 4>: 'primary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 1, <T.label: 4>: 'color-group'}, 'Key': 'value'}, {<T.id: 1>: 4, <T.label: 4>: 'primary-color', 'Color': 'yellow'}, {<T.id: 1>: 10, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 5, <T.label: 4>: 'secondary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 4, <T.label: 4>: 'primary-color'}, 'Key': 'value'}, {<T.id: 1>: 5, <T.label: 4>: 'secondary-color', 'Color': 'red-10'}]]

如何转换上面的内容以获得以下 JSON 格式的输出?
截断的休息与模式相同。

[[{
    "< T.id: 1 >": 1,
    "< T.label: 4 >": "color-group",
    "Color": "primary"
}, {
    "< T.id: 1 >": 7,
    "< T.label: 4 >": "links",
    "< Direction.IN: 2 >": {
        "< T.id: 1 >": 2,
        "< T.label: 4 >": "primary-color"
    },
    "< Direction.OUT: 3 >": {
        "< T.id: 1 >": 1,
        "< T.label: 4 >": "color-group"
    },
    "Key": "value"
}, {
    "< T.id: 1 >": 2,
    "< T.label: 4 >": "primary-color",
    "Color": "red"
}], ..... ]

EDIT 1.

我使用 graphsonV3d0 取得了一些进展

from gremlin_python.structure.io import graphsonV3d0
obj = graphsonV3d0.GraphSONWriter()
query = g.V().hasLabel('color-group').has('Color', 'primary').outE().inV().optional(outE().inV()).path().by(elementMap()).store('data').cap('data').next()
obj.to_dict(query)

Result:

{'@type': 'g:List', '@value': [path[{<T.id: 1>: 1, <T.label: 4>: 'color-group', 'Color': 'primary'}, {<T.id: 1>: 7, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 2, <T.label: 4>: 'primary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 1, <T.label: 4>: 'color-group'}, 'Key': 'value'}, {<T.id: 1>: 2, <T.label: 4>: 'primary-color', 'Color': 'red'}], path[{<T.id: 1>: 1, <T.label: 4>: 'color-group', 'Color': 'primary'}, {<T.id: 1>: 8, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 3, <T.label: 4>: 'primary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 1, <T.label: 4>: 'color-group'}, 'Key': 'value'}, {<T.id: 1>: 3, <T.label: 4>: 'primary-color', 'Color': 'blue'}], path[{<T.id: 1>: 1, <T.label: 4>: 'color-group', 'Color': 'primary'}, {<T.id: 1>: 9, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 4, <T.label: 4>: 'primary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 1, <T.label: 4>: 'color-group'}, 'Key': 'value'}, {<T.id: 1>: 4, <T.label: 4>: 'primary-color', 'Color': 'yellow'}, {<T.id: 1>: 10, <T.label: 4>: 'links', <Direction.IN: 2>: {<T.id: 1>: 5, <T.label: 4>: 'secondary-color'}, <Direction.OUT: 3>: {<T.id: 1>: 4, <T.label: 4>: 'primary-color'}, 'Key': 'value'}, {<T.id: 1>: 5, <T.label: 4>: 'secondary-color', 'Color': 'red-10'}]]}

这稍微好一点,但并不完全是 JSON 格式。


我稍微编辑了创建步骤,以使用我用来测试它的数据库 (Amazon Neptune) 并使用图形笔记本.

g.addV('color-group').property(id,'I1').property(single, 'Color', 'primary').as('i1').
  addV('primary-color').property(id,'I2').property(single, 'Color', 'red').as('i2').
  addV('primary-color').property(id,'I3').property(single, 'Color', 'blue').as('i3').
  addV('primary-color').property(id,'I4').property(single, 'Color', 'yellow').as('i4').
  addV('secondary-color').property(id,'I5').property(single, 'Color', 'red-10').as('i5').
  addE('links').from('i1').to('i2').
  addE('links').from('i1').to('i3').
  addE('links').from('i1').to('i4').
  addE('links').from('i4').to('i5')

如果我们更改,您可以更接近您正在寻找的表格by的调制path使用一个project步。例如:

g.V().hasLabel('color-group').
      has('Color', 'primary').
      outE().inV().
      optional(outE().inV()).
      path().
        by(project('id','label','properties').
             by(id).
             by(label).
             by(valueMap().by(unfold()))).
      toList()

哪个产量

1   path[{'id': 'I1', 'label': 'color-group', 'properties': {'Color': 'primary'}}, {'id': 'aec3ae0e-c3d3-5c55-1ee1-fb3996158e1e', 'label': 'links', 'properties': {}}, {'id': 'I2', 'label': 'primary-color', 'properties': {'Color': 'red'}}]
2   path[{'id': 'I1', 'label': 'color-group', 'properties': {'Color': 'primary'}}, {'id': '12c3ae0e-c3d6-c04c-b386-5273adc8b640', 'label': 'links', 'properties': {}}, {'id': 'I3', 'label': 'primary-color', 'properties': {'Color': 'blue'}}]
3   path[{'id': 'I1', 'label': 'color-group', 'properties': {'Color': 'primary'}}, {'id': 'bec3ae0e-c3d7-5cb5-1616-e53d4bba45fd', 'label': 'links', 'properties': {}}, {'id': 'I4', 'label': 'primary-color', 'properties': {'Color': 'yellow'}}, {'id': '06c3ae0e-c3da-604a-d98d-65c93547209a', 'label': 'links', 'properties': {}}, {'id': 'I5', 'label': 'secondary-color', 'properties': {'Color': 'red-10'}}]

如果我们现在更进一步,使用 Python,查询结果位于名为res- 你可以做:

for r in res[0]:
    print(r,'\n')

这给了我们

{'id': 'I1', 'label': 'color-group', 'properties': {'Color': 'primary'}} 

{'id': 'aec3ae0e-c3d3-5c55-1ee1-fb3996158e1e', 'label': 'links', 'properties': {}} 

{'id': 'I2', 'label': 'primary-color', 'properties': {'Color': 'red'}} 

使用这些构建块,我认为您可以将您可能需要的任何类似 JSON 的结果拼接在一起。

捕获结果后,我们可以将其中一“行”转换为 JSON,如下所示:

import json
s = '['
for r in res[0]:
    s += str(r)[:-1] + '},'
j = s.replace("'","\"")[:-1] + ']'

print(j)
print(json.loads(j))

这给了我们(现在有效的 JSON):

[{"id": "I1", "label": "color-group", "properties": {"Color": "primary"}},{"id": "aec3ae0e-c3d3-5c55-1ee1-fb3996158e1e", "label": "links", "properties": {}},{"id": "I2", "label": "primary-color", "properties": {"Color": "red"}}]


[{'id': 'I1', 'label': 'color-group', 'properties': {'Color': 'primary'}}, {'id': 'aec3ae0e-c3d3-5c55-1ee1-fb3996158e1e', 'label': 'links', 'properties': {}}, {'id': 'I2', 'label': 'primary-color', 'properties': {'Color': 'red'}}]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将gremlin查询结果与elementMap转换为JSON [gremlinpython 3.6.1] 的相关文章

随机推荐