如何使用 Gremlin 从 CosmosDB 图形生成自定义 JSON 输出?
How to generate a custom JSON output from a CosmosDB Graph using Gremlin?
我正在使用 CosmosDB 图形数据库来存储一些人的姓名、他们的婚姻以及他们children 的婚姻。在下图中,您会看到 丈夫 的第一次婚姻 Child A 和 Child B 来自他的第二次婚姻。
Father of Husband Mother of Husband GRAND FATHER & GRAND MOTHER
+---------------+--------------+
Marriage
|
+------------+---------------+--------------+-----------+ FATHER & MOTHER
Ex Wife A Marriage Husband Marriage Wife B
| |
Child A Child B ME & STEP BROTHERS
我想使用 GremlinAPI 生成如下所示的 JSON 输出,这是一个分层树结构。
如何将 person
结构化为 node 并将 relationship
结构化为 edge 以进行转换图表到自定义 JSON 输出?
{
"marriage": {
"husband": {
"name": "Father Of Husband"
},
"wife": {
"name": "Mother Of Husband"
}
},
"children": [
{
"marriage": {
"husband": {
"name": "Husband"
},
"wife": {
"name": "Wife A"
}
},
"children": [
{
"marriage": {
"husband": {
"name": "Child A"
},
"wife": {
"name": "Unknown"
}
}
}
]
},
{
"marriage": {
"husband": {
"name": "Husband"
},
"wife": {
"name": "Wife B"
}
},
"children": [
{
"marriage": {
"husband": {
"name": "Child B"
},
"wife": {
"name": "Unknown"
}
}
}
]
}
]
}
2019 年 6 月 21 日更新
我创建了以下查询来创建顶点和边:
g.V().drop()
g.addV('person').property(id, 'father_of_husband').property('name', 'Father Of Husband').property('title', 'husband')
g.addV('person').property(id, 'mother_of_husband').property('name', 'Mother Of Husband').property('title', 'wife')
g.addV('person').property(id, 'husband').property('name', 'Husband').property('title', 'husband')
g.addV('person').property(id, 'ex_wife_a').property('name', 'Ex Wife A').property('title', 'wife')
g.addV('person').property(id, 'wife_b').property('name', 'Wife B').property('title', 'wife')
g.addV('person').property(id, 'child_a').property('name', 'Child A').property('title', 'husband')
g.addV('person').property(id, 'child_b').property('name', 'Child B').property('title', 'wife')
g.addV('marriage').property(id, 'marriage_f_m').property('name', 'Marriage F & M')
g.addV('marriage').property(id, 'marriage_ex_wife_a_h').property('name', 'Marriage EWA & H')
g.addV('marriage').property(id, 'marriage_wife_b_h').property('name', 'Marriage WB & H')
g.V('father_of_husband').addE('married').to(g.V('marriage_f_m'))
g.V('mother_of_husband').addE('married').to(g.V('marriage_f_m'))
g.V('ex_wife_a').addE('married').to(g.V('marriage_ex_wife_a_h'))
g.V('husband').addE('married').to(g.V('marriage_ex_wife_a_h'))
g.V('wife_b').addE('married').to(g.V('marriage_wife_b_h'))
g.V('husband').addE('married').to(g.V('marriage_wife_b_h'))
g.V('husband').addE('child_of').to(g.V('marriage_f_m'))
g.V('child_a').addE('child_of').to(g.V('marriage_ex_wife_a_h'))
g.V('child_b').addE('child_of').to(g.V('marriage_wife_b_h'))
我认为没有任何方法可以按照您描述的格式构建结果。最好的办法可能是:
- 获取包含所有关系的树
- 在 client-side 上处理这棵树并将其转换为所需的结构
要获得完整的树,您需要执行以下操作:
g.V('marriage_f_m').
repeat(__.both().simplePath()).
emit().
tree()
...或包含边缘标签以简化重组:
g.V('marriage_f_m').
repeat(__.bothE().otherV().simplePath()).
emit().
tree().
by().
by(label)
我正在使用 CosmosDB 图形数据库来存储一些人的姓名、他们的婚姻以及他们children 的婚姻。在下图中,您会看到 丈夫 的第一次婚姻 Child A 和 Child B 来自他的第二次婚姻。
Father of Husband Mother of Husband GRAND FATHER & GRAND MOTHER
+---------------+--------------+
Marriage
|
+------------+---------------+--------------+-----------+ FATHER & MOTHER
Ex Wife A Marriage Husband Marriage Wife B
| |
Child A Child B ME & STEP BROTHERS
我想使用 GremlinAPI 生成如下所示的 JSON 输出,这是一个分层树结构。
如何将 person
结构化为 node 并将 relationship
结构化为 edge 以进行转换图表到自定义 JSON 输出?
{
"marriage": {
"husband": {
"name": "Father Of Husband"
},
"wife": {
"name": "Mother Of Husband"
}
},
"children": [
{
"marriage": {
"husband": {
"name": "Husband"
},
"wife": {
"name": "Wife A"
}
},
"children": [
{
"marriage": {
"husband": {
"name": "Child A"
},
"wife": {
"name": "Unknown"
}
}
}
]
},
{
"marriage": {
"husband": {
"name": "Husband"
},
"wife": {
"name": "Wife B"
}
},
"children": [
{
"marriage": {
"husband": {
"name": "Child B"
},
"wife": {
"name": "Unknown"
}
}
}
]
}
]
}
2019 年 6 月 21 日更新
我创建了以下查询来创建顶点和边:
g.V().drop()
g.addV('person').property(id, 'father_of_husband').property('name', 'Father Of Husband').property('title', 'husband')
g.addV('person').property(id, 'mother_of_husband').property('name', 'Mother Of Husband').property('title', 'wife')
g.addV('person').property(id, 'husband').property('name', 'Husband').property('title', 'husband')
g.addV('person').property(id, 'ex_wife_a').property('name', 'Ex Wife A').property('title', 'wife')
g.addV('person').property(id, 'wife_b').property('name', 'Wife B').property('title', 'wife')
g.addV('person').property(id, 'child_a').property('name', 'Child A').property('title', 'husband')
g.addV('person').property(id, 'child_b').property('name', 'Child B').property('title', 'wife')
g.addV('marriage').property(id, 'marriage_f_m').property('name', 'Marriage F & M')
g.addV('marriage').property(id, 'marriage_ex_wife_a_h').property('name', 'Marriage EWA & H')
g.addV('marriage').property(id, 'marriage_wife_b_h').property('name', 'Marriage WB & H')
g.V('father_of_husband').addE('married').to(g.V('marriage_f_m'))
g.V('mother_of_husband').addE('married').to(g.V('marriage_f_m'))
g.V('ex_wife_a').addE('married').to(g.V('marriage_ex_wife_a_h'))
g.V('husband').addE('married').to(g.V('marriage_ex_wife_a_h'))
g.V('wife_b').addE('married').to(g.V('marriage_wife_b_h'))
g.V('husband').addE('married').to(g.V('marriage_wife_b_h'))
g.V('husband').addE('child_of').to(g.V('marriage_f_m'))
g.V('child_a').addE('child_of').to(g.V('marriage_ex_wife_a_h'))
g.V('child_b').addE('child_of').to(g.V('marriage_wife_b_h'))
我认为没有任何方法可以按照您描述的格式构建结果。最好的办法可能是:
- 获取包含所有关系的树
- 在 client-side 上处理这棵树并将其转换为所需的结构
要获得完整的树,您需要执行以下操作:
g.V('marriage_f_m').
repeat(__.both().simplePath()).
emit().
tree()
...或包含边缘标签以简化重组:
g.V('marriage_f_m').
repeat(__.bothE().otherV().simplePath()).
emit().
tree().
by().
by(label)