折叠如何影响来自gremlin服务器的JSON输出?当我展开和折叠路径内容时,我得到了不同的数据结构,它添加了edge和vertex属性。虽然这是我的目标,也是要在路径中获取属性,但这似乎是奇怪的行为,我在文档中找不到此功能。
那为什么会发生这种情况?
g.V('1').out().path()
g.V('1').out().path().by(unfold().fold())
当我运行以下查询时:g.V('1').out().path()
{
...
{
"@type": "g:Path",
"@value": {
"labels": {
"@type": "g:List",
"@value": [
{
"@type": "g:Set",
"@value": []
},
{
"@type": "g:Set",
"@value": []
}
]
},
"objects": {
"@type": "g:List",
"@value": [
{
"@type": "g:Vertex",
"@value": {
"id": "1",
"label": "USER"
}
},
{
"@type": "g:Vertex",
"@value": {
"id": "2",
"label": "USER"
}
}
]
}
}
}
...
}
但是当我g.V('1').out().path().by(unfold().fold())
{
...
{
"@type": "g:Path",
"@value": {
"labels": {
"@type": "g:List",
"@value": [
{
"@type": "g:Set",
"@value": []
},
{
"@type": "g:Set",
"@value": []
}
]
},
"objects": {
"@type": "g:List",
"@value": [
{
"@type": "g:List",
"@value": [
{
"@type": "g:Vertex",
"@value": {
"id": "1",
"label": "USER",
"properties": {
"prop1": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": 101839172
},
"value": {
"@type": "g:Int32",
"@value": 1
},
"label": "prop1"
}
}
],
"created_at": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": 589742877
},
"value": {
"@type": "g:Date",
"@value": 1557226436119
},
"label": "created_at"
}
}
]
}
}
}
]
},
{
"@type": "g:List",
"@value": [
{
"@type": "g:Vertex",
"@value": {
"id": "2",
"label": "USER",
"properties": {
"prop1": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": -1354828672
},
"value": {
"@type": "g:Date",
"@value": 1557225020168
},
"label": "prop1"
}
}
],
"created_at": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": 589742878
},
"value": {
"@type": "g:Date",
"@value": 1557226436119
},
"label": "created_at"
}
}
]
}
}
}
]
}
]
}
}
}
...
}
编辑:其他信息,我发现除了fold()
之外,我还可以使用project()
和identity()
获得具有属性的整个实体。
因此,当我运行g.V('1').out().path().by(identity())
时,得到的路径内容与第一个查询相同。
"objects": {
"@type": "g:List",
"@value": [
{
"@type": "g:Vertex",
"@value": {
"id": "1",
"label": "USER"
}
},
{
"@type": "g:Vertex",
"@value": {
"id": "2",
"label": "USER"
}
}
]
}
但是当我运行g.V('1').out().path().by(project('identity').by(identity()))
时,这就是我在路径中得到的(请注意properties对象):
"objects": {
"@type": "g:List",
"@value": [
{
"@type": "g:Map",
"@value": [
"identity",
{
"@type": "g:Vertex",
"@value": {
"id": "1",
"label": "USER",
"properties": {
"prop1": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": 101839172
},
"value": {
"@type": "g:Int32",
"@value": 1
},
"label": "prop1"
}
}
],
"created_at": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": 589742877
},
"value": {
"@type": "g:Date",
"@value": 1557226436119
},
"label": "created_at"
}
}
],
}
}
}
]
}
答案 0 :(得分:1)
从服务器返回的任何图形元素(即Vertex
,Edge
或VertexProperty
)上都不应获得属性-仅由{{1 }}和id
。因此,您在第一次遍历中看到的是正确的,而在第二次使用label
时看到的是错误的。
这实际上是TinkerPop中的一个错误,我为此创建了TINKERPOP-2212。
获得您想要的东西的正确方法是按照以下方式进行操作:
by(unfold().fold())
或者也许在最新版本的TinkerPop中,将gremlin> g.V(1).out().path().by(valueMap())
==>[[name:[marko],age:[29]],[name:[lop],lang:[java]]]
==>[[name:[marko],age:[29]],[name:[vadas],age:[27]]]
==>[[name:[marko],age:[29]],[name:[josh],age:[32]]]
gremlin> g.V(1).out().path().by(valueMap(true).by(unfold()))
==>[[id:1,label:person,name:marko,age:29],[id:3,label:software,name:lop,lang:java]]
==>[[id:1,label:person,name:marko,age:29],[id:2,label:person,name:vadas,age:27]]
==>[[id:1,label:person,name:marko,age:29],[id:4,label:person,name:josh,age:32]]
替换为:
valueMap(true)