地图 gremlin 投影结果
Map gremlin projection results
想象一个项目可以通过将唯一的 tag
节点连接到 post
来标记,但标签来自不同的来源。源记录在连接边上,post和对应同一源的标签之间可能只有一条边。
此查询 returns posts 及其标签,标签包含来源和分数的详细信息:
project('title', 'tags').by('title').
by(inE().as('rel').
hasLabel('tags').project('value', '_rel').
by(outV().hasLabel('tag').values('value')).
by(project('score', 'source').
by('score').by('source')).
group().
by(values('value'))
)
结果如下:
[
{
"title": "x",
"tags": {
"dog": [
{
"value": "dog",
"_rel": {
"score": 5,
"source": "user"
}
}
],
"cat": [
{
"value": "cat",
"_rel": {
"score": 3,
"source": "user"
}
},
{
"value": "cat",
"_rel": {
"score": 2,
"source": "google"
}
}
]
}
}
]
问题是:这个形状如何转化为下面更紧凑的形式?
{
"title": "x",
"tags": [
{
"value": "dog",
"_rel": [
{
"score": 5,
"source": "user"
}
]
},
{
"value": "cat",
"_rel": [
{
"score": 2,
"source": "google"
},
{
"score": 3,
"source": "user"
}
]
}
]
}
这是一个打字稿(和 Neptune)实现,因此存在一些限制。
可在 https://gremlify.com/khvizyzeqg 及以下获得最小样本图:
property(single, 'value', 'cat').addV('tag').
as('2').
property(single, 'value', 'dog').addV('post').
as('3').
property(single, 'title', 'x').addE('tags').
from('1').to('3').property('score', 3).
property('source', 'user').
property('value', 'cat').addE('tags').
from('1').to('3').property('score', 2).
property('source', 'google').
property('value', 'cat').addE('tags').
from('2').to('3').property('score', 5).
property('source', 'user').
property('value', 'dog')
第一个答案与您要求的不完全一致,因为格式与您提供的示例不完全匹配,但我认为值得考虑使用,因为它提供了具有相同内容和更紧凑的数据结构Gremlin 非常易读:
gremlin> g.V().hasLabel('post').
......1> project('title', 'tags').
......2> by('title').
......3> by(inE().hasLabel('tags').
......4> group().
......5> by('value').
......6> by(project('score','source').
......7> by('score').by('source').
......8> fold()))
==>[title:x,tags:[cat:[[score:2,source:google],[score:3,source:mobius]],dog:[[score:5,source:mobius]]]]
第二个答案产生的输出应与您请求的输出相匹配,但如您所见,它会强制您解构上面的 Map
以 re-write 它返回以匹配您想要的形式:
gremlin> g.V().hasLabel('post').
......1> project('title', 'tags').
......2> by('title').
......3> by(inE().hasLabel('tags').
......4> group().
......5> by('value').
......6> by(project('score','source').
......7> by('score').by('source').
......8> fold()).
......9> unfold().
.....10> project('value','_rel').
.....11> by(keys).
.....12> by(values).
.....13> fold())
==>[title:x,tags:[[value:cat,_rel:[[score:2,source:google],[score:3,source:mobius]]],[value:dog,_rel:[[score:5,source:mobius]]]]]
想象一个项目可以通过将唯一的 tag
节点连接到 post
来标记,但标签来自不同的来源。源记录在连接边上,post和对应同一源的标签之间可能只有一条边。
此查询 returns posts 及其标签,标签包含来源和分数的详细信息:
project('title', 'tags').by('title').
by(inE().as('rel').
hasLabel('tags').project('value', '_rel').
by(outV().hasLabel('tag').values('value')).
by(project('score', 'source').
by('score').by('source')).
group().
by(values('value'))
)
结果如下:
[
{
"title": "x",
"tags": {
"dog": [
{
"value": "dog",
"_rel": {
"score": 5,
"source": "user"
}
}
],
"cat": [
{
"value": "cat",
"_rel": {
"score": 3,
"source": "user"
}
},
{
"value": "cat",
"_rel": {
"score": 2,
"source": "google"
}
}
]
}
}
]
问题是:这个形状如何转化为下面更紧凑的形式?
{
"title": "x",
"tags": [
{
"value": "dog",
"_rel": [
{
"score": 5,
"source": "user"
}
]
},
{
"value": "cat",
"_rel": [
{
"score": 2,
"source": "google"
},
{
"score": 3,
"source": "user"
}
]
}
]
}
这是一个打字稿(和 Neptune)实现,因此存在一些限制。
可在 https://gremlify.com/khvizyzeqg 及以下获得最小样本图:
property(single, 'value', 'cat').addV('tag').
as('2').
property(single, 'value', 'dog').addV('post').
as('3').
property(single, 'title', 'x').addE('tags').
from('1').to('3').property('score', 3).
property('source', 'user').
property('value', 'cat').addE('tags').
from('1').to('3').property('score', 2).
property('source', 'google').
property('value', 'cat').addE('tags').
from('2').to('3').property('score', 5).
property('source', 'user').
property('value', 'dog')
第一个答案与您要求的不完全一致,因为格式与您提供的示例不完全匹配,但我认为值得考虑使用,因为它提供了具有相同内容和更紧凑的数据结构Gremlin 非常易读:
gremlin> g.V().hasLabel('post').
......1> project('title', 'tags').
......2> by('title').
......3> by(inE().hasLabel('tags').
......4> group().
......5> by('value').
......6> by(project('score','source').
......7> by('score').by('source').
......8> fold()))
==>[title:x,tags:[cat:[[score:2,source:google],[score:3,source:mobius]],dog:[[score:5,source:mobius]]]]
第二个答案产生的输出应与您请求的输出相匹配,但如您所见,它会强制您解构上面的 Map
以 re-write 它返回以匹配您想要的形式:
gremlin> g.V().hasLabel('post').
......1> project('title', 'tags').
......2> by('title').
......3> by(inE().hasLabel('tags').
......4> group().
......5> by('value').
......6> by(project('score','source').
......7> by('score').by('source').
......8> fold()).
......9> unfold().
.....10> project('value','_rel').
.....11> by(keys).
.....12> by(values).
.....13> fold())
==>[title:x,tags:[[value:cat,_rel:[[score:2,source:google],[score:3,source:mobius]]],[value:dog,_rel:[[score:5,source:mobius]]]]]