Gremlin,按边属性分组
Gremlin, Group By Edge Properties
我正在使用 CosmosDB Gremlin 引擎并尝试编写一个查询,该查询 returns 所有 EDGE 属性,按键分组,具有不同值的列表。
这是我的架构示例;
g.V().has('server','id','AARCWIVPAP13056').fold().coalesce(unfold(), addV('server').property('id', 'AARCWIVPAP13056').property('record_type', 'server').property('OsName', 'Microsoft Windows Server 2012 R2 Standard').property('CsCaption', 'AARCWIVPAP13056').property('OsType', 'WINNT').property('OsOperatingSystemSKU', 'StandardServerEdition').property('OsInstallDate', '/Date(1478080755000)/').property('PSComputerName', 'None').property('WindowsEditionId', 'ServerStandard').property('WindowsProductName', 'Windows Server 2012 R2 Standard').property('BiosCaption', 'PhoenixBIOS 4.0 Release 6.0 ').property('CsNumberOfLogicalProcessors', '1').property('CsNumberOfProcessors', '1').property('CsTotalPhysicalMemory', '8589463552').property('TotalPhysicalMemory', '8'))
g.V().has('service','id','AdobeARMservice').fold().coalesce(unfold(), addV('service').property('id', 'AdobeARMservice').property('display_name', 'Adobe Acrobat Update Service').property('record_type', 'service').property('service_name', 'AdobeARMservice').property('name', 'AdobeARMservice'))
g.V('AARCWIVPAP13056').as('parent').V('AdobeARMservice').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'LocalSystem').property('start_type', 'Disabled')
g.V('AdobeARMservice').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'LocalSystem').property('start_type', 'Disabled')
g.V().has('service','id','AdtAgent').fold().coalesce(unfold(), addV('service').property('id', 'AdtAgent').property('display_name', 'Microsoft Monitoring Agent Audit Forwarding').property('record_type', 'service').property('service_name', 'AdtAgent').property('name', 'AdtAgent'))
g.V('AARCWIVPAP13056').as('parent').V('AdtAgent').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\NetworkService').property('start_type', 'Disabled')
g.V('AdtAgent').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\NetworkService').property('start_type', 'Disabled')
g.V().has('service','id','AeLookupSvc').fold().coalesce(unfold(), addV('service').property('id', 'AeLookupSvc').property('display_name', 'Application Experience').property('record_type', 'service').property('service_name', 'AeLookupSvc').property('name', 'AeLookupSvc'))
g.V('AARCWIVPAP13056').as('parent').V('AeLookupSvc').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'localSystem').property('start_type', 'Manual')
g.V('AeLookupSvc').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'localSystem').property('start_type', 'Manual')
g.V().has('service','id','ALG').fold().coalesce(unfold(), addV('service').property('id', 'ALG').property('display_name', 'Application Layer Gateway Service').property('record_type', 'service').property('service_name', 'ALG').property('name', 'ALG'))
g.V('AARCWIVPAP13056').as('parent').V('ALG').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\LocalService').property('start_type', 'Manual')
g.V('ALG').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\LocalService').property('start_type', 'Manual')
g.V().has('scheduled_task','id','computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').fold().coalesce(unfold(), addV('scheduled_task').property('task_name', 'Computer Maintenance - SG_AFI_CompMaint_Sa_0030_Unv').property('id', 'computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').property('record_type', 'scheduled_task').property('task_date', 'None').property('author', 'ASHLEYFURNITURE\s_afiarcOMAct').property('task_path', '\'))
g.V('AARCWIVPAP13056').as('parent').V('computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').coalesce(__.inE('runs_task').where(outV().as('parent')), addE('runs_task').from('parent'))
g.V('computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('task_runs_on').where(outV().as('parent')), addE('task_runs_on').from('parent'))
g.V().has('scheduled_task','id','configmgr_client_health').fold().coalesce(unfold(), addV('scheduled_task').property('task_name', 'ConfigMgr Client Health').property('id', 'configmgr_client_health').property('record_type', 'scheduled_task').property('task_date', 'None').property('author', 'ASHLEYFURNITURE\s_afiarcOMAct').property('task_path', '\'))
g.V('AARCWIVPAP13056').as('parent').V('configmgr_client_health').coalesce(__.inE('runs_task').where(outV().as('parent')), addE('runs_task').from('parent'))
g.V('configmgr_client_health').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('task_runs_on').where(outV().as('parent')), addE('task_runs_on').from('parent'))
边上的属性根据我链接的 2 个顶点而变化,因此我无法在查询中指定 属性 名称。此外,一些边没有额外的属性。
以下查询使我接近我想要的输出;
g.V().has('id', 'AARCWIVPAP13056')
.as('entity')
.map(outE().group().by(label))
.as('edge')
.select('entity', 'edge')
但它返回所有原始边。
我的回复的理想形式是;
[
{
"entity": {
"id": "AARCWIVPAP13056",
"label": "server",
"type": "vertex",
"properties": {
"record_type": [
{
"id": "AARCWIVPAP13056|record_type",
"value": "server"
}
],
"OsName": [
{
"id": "55c70a2a-afb3-4aec-a4e1-86bcbd360068",
"value": "Microsoft Windows Server 2012 R2 Standard"
}
],
"CsCaption": [
{
"id": "819461e1-8833-4c65-858f-eeea1051edf9",
"value": "AARCWIVPAP13056"
}
],
"OsType": [
{
"id": "f1928eee-fdd1-479b-8b8d-361666761481",
"value": "WINNT"
}
],
"OsOperatingSystemSKU": [
{
"id": "bda0ceb5-d818-477d-8998-24537757225f",
"value": "StandardServerEdition"
}
],
"OsInstallDate": [
{
"id": "487beea1-4d7c-4e68-be0f-a3171c1f86db",
"value": "/Date(1478080755000)/"
}
],
"PSComputerName": [
{
"id": "2d3a9c6b-83c2-4058-a232-070d9928ed28",
"value": "None"
}
],
"WindowsEditionId": [
{
"id": "b0a0378c-901f-4510-a157-7fbc363d0c27",
"value": "ServerStandard"
}
],
"WindowsProductName": [
{
"id": "684f384c-2e19-427a-9c34-e7ee0a1c3c53",
"value": "Windows Server 2012 R2 Standard"
}
],
"BiosCaption": [
{
"id": "a8ea593b-6cee-42b6-9275-5d06ca4dd6a2",
"value": "PhoenixBIOS 4.0 Release 6.0 "
}
],
"CsNumberOfLogicalProcessors": [
{
"id": "a245cc43-d2d5-44e1-9696-f7fc585c6490",
"value": "1"
}
],
"CsNumberOfProcessors": [
{
"id": "67de0a1f-0bab-4dae-90d0-70c46dc50775",
"value": "1"
}
],
"CsTotalPhysicalMemory": [
{
"id": "32def833-079b-4184-a428-46a400af9cb1",
"value": "8589463552"
}
],
"TotalPhysicalMemory": [
{
"id": "e6bfedb5-f8f5-460a-958e-1b287a407295",
"value": "8"
}
],
"role": [
{
"id": "d2943f08-d3a8-4ccd-94e8-188fc66f90aa",
"value": "APP"
}
],
"AppContact": [
{
"id": "a4c72bcc-f2c2-47c6-982f-f1819d7aa0ab",
"value": "Keith Branes"
}
],
"test": [
{
"id": "fd37a6de-e60c-4589-901f-1473cfd416a9",
"value": "tester"
}
],
"acl_test": [
{
"id": "aeb4d52b-5615-484f-917a-2a21f1a83260",
"value": "acl_test_value",
"properties": {
"harvested": "private"
}
}
],
"acl_test2": [
{
"id": "0b3b5216-3a1d-4817-bcb2-8acd2c9bcffa",
"value": "acl_test_value2",
"properties": {
"read_only": "true"
}
}
],
"tester": [
{
"id": "c0a1f3b0-4a26-40b2-a762-8a1e008dbcb0",
"value": "rester"
}
]
}
},
"edge": {
"has_service": [
{
"status": ["Running", "Stopped"],
"start_type": ["Manual", "Disabled"],
"service_account": [ "Network Service", "LocalSystem" ]
}],
"runs_task": []
}
]
你的数据和查询仍然没有 return 我的任何数据,它有点复杂,所以我不确定它在哪里断开连接以修复它。无论如何,从你写的来看,我认为你可以用 project()
:
做你想做的事
gremlin> g.V().has('person', 'name', 'marko').
......1> project('entity', 'edgeData').
......2> by(valueMap(true)).
......3> by(outE().properties().group().by(key()).by(value().fold()))
==>[entity:[id:1,label:person,name:[marko],age:[29]],edgeData:[weight:[0.4,0.5,1.0]]]
我正在使用 CosmosDB Gremlin 引擎并尝试编写一个查询,该查询 returns 所有 EDGE 属性,按键分组,具有不同值的列表。
这是我的架构示例;
g.V().has('server','id','AARCWIVPAP13056').fold().coalesce(unfold(), addV('server').property('id', 'AARCWIVPAP13056').property('record_type', 'server').property('OsName', 'Microsoft Windows Server 2012 R2 Standard').property('CsCaption', 'AARCWIVPAP13056').property('OsType', 'WINNT').property('OsOperatingSystemSKU', 'StandardServerEdition').property('OsInstallDate', '/Date(1478080755000)/').property('PSComputerName', 'None').property('WindowsEditionId', 'ServerStandard').property('WindowsProductName', 'Windows Server 2012 R2 Standard').property('BiosCaption', 'PhoenixBIOS 4.0 Release 6.0 ').property('CsNumberOfLogicalProcessors', '1').property('CsNumberOfProcessors', '1').property('CsTotalPhysicalMemory', '8589463552').property('TotalPhysicalMemory', '8'))
g.V().has('service','id','AdobeARMservice').fold().coalesce(unfold(), addV('service').property('id', 'AdobeARMservice').property('display_name', 'Adobe Acrobat Update Service').property('record_type', 'service').property('service_name', 'AdobeARMservice').property('name', 'AdobeARMservice'))
g.V('AARCWIVPAP13056').as('parent').V('AdobeARMservice').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'LocalSystem').property('start_type', 'Disabled')
g.V('AdobeARMservice').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'LocalSystem').property('start_type', 'Disabled')
g.V().has('service','id','AdtAgent').fold().coalesce(unfold(), addV('service').property('id', 'AdtAgent').property('display_name', 'Microsoft Monitoring Agent Audit Forwarding').property('record_type', 'service').property('service_name', 'AdtAgent').property('name', 'AdtAgent'))
g.V('AARCWIVPAP13056').as('parent').V('AdtAgent').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\NetworkService').property('start_type', 'Disabled')
g.V('AdtAgent').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\NetworkService').property('start_type', 'Disabled')
g.V().has('service','id','AeLookupSvc').fold().coalesce(unfold(), addV('service').property('id', 'AeLookupSvc').property('display_name', 'Application Experience').property('record_type', 'service').property('service_name', 'AeLookupSvc').property('name', 'AeLookupSvc'))
g.V('AARCWIVPAP13056').as('parent').V('AeLookupSvc').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'localSystem').property('start_type', 'Manual')
g.V('AeLookupSvc').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'localSystem').property('start_type', 'Manual')
g.V().has('service','id','ALG').fold().coalesce(unfold(), addV('service').property('id', 'ALG').property('display_name', 'Application Layer Gateway Service').property('record_type', 'service').property('service_name', 'ALG').property('name', 'ALG'))
g.V('AARCWIVPAP13056').as('parent').V('ALG').coalesce(__.inE('has_service').where(outV().as('parent')), addE('has_service').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\LocalService').property('start_type', 'Manual')
g.V('ALG').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('installed_on').where(outV().as('parent')), addE('installed_on').from('parent')).property('status', 'Stopped').property('service_account', 'NT AUTHORITY\LocalService').property('start_type', 'Manual')
g.V().has('scheduled_task','id','computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').fold().coalesce(unfold(), addV('scheduled_task').property('task_name', 'Computer Maintenance - SG_AFI_CompMaint_Sa_0030_Unv').property('id', 'computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').property('record_type', 'scheduled_task').property('task_date', 'None').property('author', 'ASHLEYFURNITURE\s_afiarcOMAct').property('task_path', '\'))
g.V('AARCWIVPAP13056').as('parent').V('computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').coalesce(__.inE('runs_task').where(outV().as('parent')), addE('runs_task').from('parent'))
g.V('computer_maintenance_-_sg_afi_compmaint_sa_0030_unv').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('task_runs_on').where(outV().as('parent')), addE('task_runs_on').from('parent'))
g.V().has('scheduled_task','id','configmgr_client_health').fold().coalesce(unfold(), addV('scheduled_task').property('task_name', 'ConfigMgr Client Health').property('id', 'configmgr_client_health').property('record_type', 'scheduled_task').property('task_date', 'None').property('author', 'ASHLEYFURNITURE\s_afiarcOMAct').property('task_path', '\'))
g.V('AARCWIVPAP13056').as('parent').V('configmgr_client_health').coalesce(__.inE('runs_task').where(outV().as('parent')), addE('runs_task').from('parent'))
g.V('configmgr_client_health').as('parent').V('AARCWIVPAP13056').coalesce(__.inE('task_runs_on').where(outV().as('parent')), addE('task_runs_on').from('parent'))
边上的属性根据我链接的 2 个顶点而变化,因此我无法在查询中指定 属性 名称。此外,一些边没有额外的属性。
以下查询使我接近我想要的输出;
g.V().has('id', 'AARCWIVPAP13056')
.as('entity')
.map(outE().group().by(label))
.as('edge')
.select('entity', 'edge')
但它返回所有原始边。
我的回复的理想形式是;
[
{
"entity": {
"id": "AARCWIVPAP13056",
"label": "server",
"type": "vertex",
"properties": {
"record_type": [
{
"id": "AARCWIVPAP13056|record_type",
"value": "server"
}
],
"OsName": [
{
"id": "55c70a2a-afb3-4aec-a4e1-86bcbd360068",
"value": "Microsoft Windows Server 2012 R2 Standard"
}
],
"CsCaption": [
{
"id": "819461e1-8833-4c65-858f-eeea1051edf9",
"value": "AARCWIVPAP13056"
}
],
"OsType": [
{
"id": "f1928eee-fdd1-479b-8b8d-361666761481",
"value": "WINNT"
}
],
"OsOperatingSystemSKU": [
{
"id": "bda0ceb5-d818-477d-8998-24537757225f",
"value": "StandardServerEdition"
}
],
"OsInstallDate": [
{
"id": "487beea1-4d7c-4e68-be0f-a3171c1f86db",
"value": "/Date(1478080755000)/"
}
],
"PSComputerName": [
{
"id": "2d3a9c6b-83c2-4058-a232-070d9928ed28",
"value": "None"
}
],
"WindowsEditionId": [
{
"id": "b0a0378c-901f-4510-a157-7fbc363d0c27",
"value": "ServerStandard"
}
],
"WindowsProductName": [
{
"id": "684f384c-2e19-427a-9c34-e7ee0a1c3c53",
"value": "Windows Server 2012 R2 Standard"
}
],
"BiosCaption": [
{
"id": "a8ea593b-6cee-42b6-9275-5d06ca4dd6a2",
"value": "PhoenixBIOS 4.0 Release 6.0 "
}
],
"CsNumberOfLogicalProcessors": [
{
"id": "a245cc43-d2d5-44e1-9696-f7fc585c6490",
"value": "1"
}
],
"CsNumberOfProcessors": [
{
"id": "67de0a1f-0bab-4dae-90d0-70c46dc50775",
"value": "1"
}
],
"CsTotalPhysicalMemory": [
{
"id": "32def833-079b-4184-a428-46a400af9cb1",
"value": "8589463552"
}
],
"TotalPhysicalMemory": [
{
"id": "e6bfedb5-f8f5-460a-958e-1b287a407295",
"value": "8"
}
],
"role": [
{
"id": "d2943f08-d3a8-4ccd-94e8-188fc66f90aa",
"value": "APP"
}
],
"AppContact": [
{
"id": "a4c72bcc-f2c2-47c6-982f-f1819d7aa0ab",
"value": "Keith Branes"
}
],
"test": [
{
"id": "fd37a6de-e60c-4589-901f-1473cfd416a9",
"value": "tester"
}
],
"acl_test": [
{
"id": "aeb4d52b-5615-484f-917a-2a21f1a83260",
"value": "acl_test_value",
"properties": {
"harvested": "private"
}
}
],
"acl_test2": [
{
"id": "0b3b5216-3a1d-4817-bcb2-8acd2c9bcffa",
"value": "acl_test_value2",
"properties": {
"read_only": "true"
}
}
],
"tester": [
{
"id": "c0a1f3b0-4a26-40b2-a762-8a1e008dbcb0",
"value": "rester"
}
]
}
},
"edge": {
"has_service": [
{
"status": ["Running", "Stopped"],
"start_type": ["Manual", "Disabled"],
"service_account": [ "Network Service", "LocalSystem" ]
}],
"runs_task": []
}
]
你的数据和查询仍然没有 return 我的任何数据,它有点复杂,所以我不确定它在哪里断开连接以修复它。无论如何,从你写的来看,我认为你可以用 project()
:
gremlin> g.V().has('person', 'name', 'marko').
......1> project('entity', 'edgeData').
......2> by(valueMap(true)).
......3> by(outE().properties().group().by(key()).by(value().fold()))
==>[entity:[id:1,label:person,name:[marko],age:[29]],edgeData:[weight:[0.4,0.5,1.0]]]