Related
This is what how the minted picture shows up I have a dApp i'm working on with wordpress. I used Enefti Theme and i used ModelTheme plugin as my NFT creator and i included their contract on my dApp, it shows that i have successfully minted the NFT, but i can't find it on my dApp even though it's confirmed on bsc scan. also, when i import it on my mobile metamask it doesn't show the photo i minted, just a blank picture.
This is the ABI of the contract (on the configure page, it requires ABI and bytecode put together but i can't paste the bytecode here):
{
"_format": "hh-sol-artifact-1",
"contractName": "NFT",
"sourceName": "contracts/NFT.sol",
"abi": [
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"internalType": "string",
"name": "_symbol",
"type": "string"
},
{
"internalType": "string",
"name": "_initBaseURI",
"type": "string"
},
{
"internalType": "string",
"name": "_initNotRevealedUri",
"type": "string"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "approved",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "ApprovalForAll",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "approve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "baseExtension",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "cost",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "isApprovedForAll",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxMintAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_mintAmount",
"type": "uint256"
}
],
"name": "mint",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "notRevealedUri",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_state",
"type": "bool"
}
],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "reveal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "revealed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "_data",
"type": "bytes"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_newBaseExtension",
"type": "string"
}
],
"name": "setBaseExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_newBaseURI",
"type": "string"
}
],
"name": "setBaseURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_newCost",
"type": "uint256"
}
],
"name": "setCost",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_notRevealedURI",
"type": "string"
}
],
"name": "setNotRevealedURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_newmaxMintAmount",
"type": "uint256"
}
],
"name": "setmaxMintAmount",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "tokenByIndex",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "tokenOfOwnerByIndex",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_owner",
"type": "address"
}
],
"name": "walletOfOwner",
"outputs": [
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "withdraw",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
]
}
I am experimenting with the HERE Waypoint Sequencing API using the new JSON request format, and it doesn't seem to take into account delivery windows specified in the times array within the plan object. I went back to the example provided in the documentation and found that the same thing was happening: Arrival and departure times are far from the specified delivery windows.
In my Example, Customer 1 has times:
"times": [["2020-07-04T08:00:00Z","2020-07-04T10:00:00Z"],["2020-07-04T16:00:00Z","2020-07-04T18:00:00Z"]]
However, the solution contains:
"time": {
"arrival": "2020-07-04T00:30:00.000+0000",
"departure": "2020-07-04T00:33:00.000+0000"
}
Which isn't even close.
Endpoint: https://wps.hereapi.com/v8/findsequence
Request:
{
"configuration": {
"optimizations": {
"traffic": "liveOrHistorical",
"waitingTime": {
"bufferTime": 15,
"reduce": false
}
}
},
"fleet": {
"profiles": [{"type":"car","name":"normal_car"}],
"types": [
{
"amount": 1,
"capacity": [10,5],
"costs": {
"distance": 0.0001,
"fixed": 22,
"time": 0.0048
},
"id": "string",
"limits": {
"maxDistance": 20000,
"shiftTime": 21600
},
"profile": "normal_car",
"shifts": [
{
"breaks": [
{
"duration": 180,
"location": {
"lat": 52.53088,
"lng": 13.38471
},
"times": [["2020-07-04T08:00:00Z","2020-07-04T10:00:00Z"],["2020-07-04T16:00:00Z","2020-07-04T18:00:00Z"]]
}
],
"end": {
"location": {
"lat": 52.53088,
"lng": 13.38471
},
"time": "2020-07-04T23:30:00Z"
},
"start": {
"location": {
"lat": 52.53088,
"lng": 13.38471
},
"time": "2020-07-04T00:30:00Z"
}
}
],
"skills": ["fridge"]
}
]
},
"id": "7f3423c2-784a-4983-b472-e14107d5a54a",
"plan": {
"jobs": [
{
"id": "string",
"places": {
"deliveries": [
{
"demand": [10,5],
"duration": 180,
"location": {
"lat": 52.53088,
"lng": 13.38471
},
"tag": "Customer 1",
"times": [["2020-07-04T08:00:00Z","2020-07-04T10:00:00Z"],["2020-07-04T16:00:00Z","2020-07-04T18:00:00Z"]]
},
{
"demand": [10,5],
"duration": 180,
"location": {
"lat": 53.53088,
"lng": 14.98471
},
"tag": "Customer 2",
"times": [["2020-07-04T08:00:00Z","2020-07-04T10:00:00Z"],["2020-07-04T16:00:00Z","2020-07-04T18:00:00Z"]]
}
],
"pickups": [
{
"demand": [10,5],
"duration": 180,
"location": {
"lat": 52.53088,
"lng": 13.98471
},
"tag": "some_tag",
"times": [["2020-07-04T08:00:00Z","2020-07-04T10:00:00Z"],["2020-07-04T16:00:00Z","2020-07-04T18:00:00Z"]]
}
]
},
"skills": ["fridge"]
}
],
"relations": [
{
"jobs": [
"string"
],
"type": "flexible",
"vehicleId": "7f3423c2-784a-4983-b472-e14107d5a54a"
}
]
}
}
Response:
{
"problemId": "7f3423c2-784a-4983-b472-e14107d5a54a",
"statistic": {
"cost": null,
"distance": 441655,
"duration": 20127,
"times": {
"break": 0,
"driving": 19587,
"serving": 540,
"waiting": 0
}
},
"tours": [
{
"vehicleId": "string",
"typeId": null,
"stops": [
{
"location": {
"lat": 52.53088,
"lng": 13.38471
},
"time": {
"arrival": null,
"departure": "2020-07-04T00:30:00.000+0000"
},
"load": [
],
"activities": [
{
"jobId": "departure",
"jobTag": "departure",
"type": null,
"location": null,
"time": null
}
]
},
{
"location": {
"lat": 52.53088,
"lng": 13.38471
},
"time": {
"arrival": "2020-07-04T00:30:00.000+0000",
"departure": "2020-07-04T00:33:00.000+0000"
},
"load": [
],
"activities": [
{
"jobId": "Customer 1",
"jobTag": "Customer 1",
"type": null,
"location": null,
"time": null
}
]
},
{
"location": {
"lat": 52.53088,
"lng": 13.98471
},
"time": {
"arrival": "2020-07-04T01:34:05.000+0000",
"departure": "2020-07-04T01:37:05.000+0000"
},
"load": [
],
"activities": [
{
"jobId": "some_tag",
"jobTag": "some_tag",
"type": null,
"location": null,
"time": null
}
]
},
{
"location": {
"lat": 53.53088,
"lng": 14.98471
},
"time": {
"arrival": "2020-07-04T03:53:37.000+0000",
"departure": "2020-07-04T03:56:37.000+0000"
},
"load": [
],
"activities": [
{
"jobId": "Customer 2",
"jobTag": "Customer 2",
"type": null,
"location": null,
"time": null
}
]
},
{
"location": {
"lat": 52.53088,
"lng": 13.38471
},
"time": {
"arrival": "2020-07-04T06:05:27.000+0000",
"departure": null
},
"load": [
],
"activities": [
{
"jobId": "arrival",
"jobTag": "arrival",
"type": null,
"location": null,
"time": null
}
]
}
],
"statistic": {
"cost": null,
"distance": 441655,
"duration": 20127,
"times": {
"break": 0,
"driving": 19587,
"serving": 540,
"waiting": 0
}
}
}
],
"unassigned": null
}
Am I missing something?
I am using the 'Explore Popular Places by Category' API and it always returns averageRating as 0 for all items in the result.
I made this call with various categories such as restaurants and sights-museums, but it always returns 0 for averageRating. Does HERE not provide this detail, and if so, why is it returned in the response?
Some details:
I am making a call to this url:
https://places.ls.hereapi.com/places/v1/discover/explore?at=52.5159%2C13.3777&cat=sights-museums&apiKey={api_key}
and it returns something like this:
{
"results": {
"next": "https://places.ls.hereapi.com/places/v1/discover/explore;context=Y2F0PXNpZ2h0cy1tdXNldW1zJmZsb3ctaWQ9Mjk0ZjU1NTgtMmY0Mi01Y2FiLWJlYWUtOGEyM2ViY2EzMzgzXzE1ODMyNjMyNjEwMzZfMF84NTcyJm9mZnNldD0yMCZzaXplPTIw?at=52.5159%2C13.3777&app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q",
"items": [
{
"position": [
52.51629,
13.37817
],
"distance": 54,
"title": "Brandenburg Gate",
"averageRating": 0,
"category": {
"id": "landmark-attraction",
"title": "Landmark/Attraction",
"href": "https://places.ls.hereapi.com/places/v1/categories/places/landmark-attraction?app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q",
"type": "urn:nlp-types:category",
"system": "places"
},
"icon": "https://download.vcdn.data.here.com/p/d/places2/icons/categories/38.icon",
"vicinity": "Pariser Platz<br/>Mitte, 10117 Berlin",
"having": [],
"type": "urn:nlp-types:place",
"href": "https://places.ls.hereapi.com/places/v1/places/276u33db-8ee2e0de906e459cbade0593986debe9;context=Zmxvdy1pZD0yOTRmNTU1OC0yZjQyLTVjYWItYmVhZS04YTIzZWJjYTMzODNfMTU4MzI2MzI2MTAzNl8wXzg1NzImcmFuaz0w?app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q",
"id": "276u33db-8ee2e0de906e459cbade0593986debe9",
"alternativeNames": [
{
"name": "Brandenburger Tor",
"language": "de"
}
]
},
{
"position": [
52.51373,
13.37976
],
"distance": 279,
"title": "Holocaust Memorial",
"averageRating": 0,
"category": {
"id": "museum",
"title": "Museum",
"href": "https://places.ls.hereapi.com/places/v1/categories/places/museum?app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q",
"type": "urn:nlp-types:category",
"system": "places"
},
"icon": "https://download.vcdn.data.here.com/p/d/places2/icons/categories/10.icon",
"vicinity": "Cora-Berliner-Straße 1<br/>Mitte, 10117 Berlin",
"having": [],
"type": "urn:nlp-types:place",
"href": "https://places.ls.hereapi.com/places/v1/places/276u33de-df7d57fd38494a93b2018fe549a0fd75;context=Zmxvdy1pZD0yOTRmNTU1OC0yZjQyLTVjYWItYmVhZS04YTIzZWJjYTMzODNfMTU4MzI2MzI2MTAzNl8wXzg1NzImcmFuaz0x?app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q",
"id": "276u33de-df7d57fd38494a93b2018fe549a0fd75",
"openingHours": {
"text": "Tue-Sun: 10:00 - 20:00",
"label": "Opening hours",
"isOpen": false,
"structured": [
{
"start": "T100000",
"duration": "PT10H00M",
"recurrence": "FREQ:DAILY;BYDAY:TU,WE,TH,FR,SA,SU"
}
]
},
"alternativeNames": [
{
"name": "Memorial to the Murdered European Jews",
"language": "en"
},
{
"name": "Memorial to the Murdered Jews of Europe",
"language": "en"
},
{
"name": "Denkmal für die ermordeten Juden Europas",
"language": "de"
}
]
},
{
"position": [
52.51666,
13.40784
],
"distance": 2041,
"title": "Nicholas Quarter",
"averageRating": 0,
"category": {
"id": "museum",
"title": "Museum",
"href": "https://places.ls.hereapi.com/places/v1/categories/places/museum?app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q",
"type": "urn:nlp-types:category",
"system": "places"
},
"icon": "https://download.vcdn.data.here.com/p/d/places2/icons/categories/10.icon",
"vicinity": "Nikolaikirchplatz<br/>Mitte, 10178 Berlin",
"having": [],
"type": "urn:nlp-types:place",
"href": "https://places.ls.hereapi.com/places/v1/places/276u33dc-049683d3c6be4bdba823808678a1b164;context=Zmxvdy1pZD0yOTRmNTU1OC0yZjQyLTVjYWItYmVhZS04YTIzZWJjYTMzODNfMTU4MzI2MzI2MTAzNl8wXzg1NzImcmFuaz0xOQ?app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q",
"id": "276u33dc-049683d3c6be4bdba823808678a1b164",
"alternativeNames": [
{
"name": "Nikolaiviertel",
"language": "en"
},
{
"name": "Nikolaiviertel",
"language": "de"
}
]
}
]
},
"search": {
"context": {
"location": {
"position": [
52.5159,
13.3777
],
"address": {
"text": "Ebertstraße 22<br/>Mitte, 10117 Berlin<br/>Germany",
"house": "22",
"street": "Ebertstraße",
"postalCode": "10117",
"district": "Mitte",
"city": "Berlin",
"county": "Berlin",
"stateCode": "Berlin",
"country": "Germany",
"countryCode": "DEU"
}
},
"type": "urn:nlp-types:place",
"href": "https://places.ls.hereapi.com/places/v1/places/loc-dmVyc2lvbj0xO3RpdGxlPUViZXJ0c3RyYSVDMyU5RmUrMjI7bGF0PTUyLjUxNTk7bG9uPTEzLjM3Nzc7c3RyZWV0PUViZXJ0c3RyYSVDMyU5RmU7aG91c2U9MjI7Y2l0eT1CZXJsaW47cG9zdGFsQ29kZT0xMDExNztjb3VudHJ5PURFVTtkaXN0cmljdD1NaXR0ZTtzdGF0ZUNvZGU9QmVybGluO2NvdW50eT1CZXJsaW47Y2F0ZWdvcnlJZD1idWlsZGluZztzb3VyY2VTeXN0ZW09aW50ZXJuYWw;context=c2VhcmNoQ29udGV4dD0x?app_id=LKO34glU2MBEVbcOD5mQ&app_code=A2ta_nQ8HRYwenju5HFG5Q"
}
}
}
Does HERE not provide the averageRatings of restaurants or sights-museums?
From the docs it appears if the place hasn't received a rating it'll be 0
Note: If the place has no ratings (yet), both the average and the count values are zero. But if the place cannot be rated (i.e. a street), the whole rating object is not present.
https://developer.here.com/documentation/places/dev_guide/topics/object-rating.html
I am trying to get the venue list using the API
https://indoor-discovery.venue.maps.api.here.com/discovery/v2?app_id=XXXXXXXXXXXXXXXXXXXX&app_code=XXXXXXXXXXXXXXXXXXXX&at=31.2403,74.6354,8.6291,77.5743
The "at" parameter almost covers the country. but the results always come back as
{
"hostname": "ip-10-13-214-44",
"type": "venues",
"status": {
"code": "OK",
"reason": "DISCOVERY_SUCCESSFULL"
},
"results": {
"items": []
}
}
The maximum value for the bounding box is at 100km x 100km. If you search within a smaller area you will get some results in the list. Here is one for the coverage of Chennai:
https://indoor-discovery.venue.maps.api.here.com/discovery/v2?app_id=yyy&app_code=xxxx&at=13.2403,79.8454,12.7291,80.5743
{
"hostname": "ip-10-13-214-44",
"type": "venues",
"status": {
"code": "OK",
"reason": "DISCOVERY_SUCCESSFULL"
},
"results": {
"items": [
{
"id": "DM_17331",
"title": "Phoenix Marketcity Mall",
"address": {
"countryCode": "IND",
"city": "Chennai",
"postalCode": "600042",
"street": "Radha Mohan Street",
"house": ""
},
"position": [
12.991487949990416,
80.21652530007341
],
"distance": 1045.380777404391,
"type": "urn:nlp-types:venue",
"vicinity": "Radha Mohan Street,600042,Chennai,IND",
"bbox": [
[
12.992687434189028,
80.21572801724027
],
[
12.990288596080005,
80.21732267846822
]
],
"minFloor": -1,
"maxFloor": 3,
"namespace": "public"
},
{
"id": "DM_3869",
"title": "Maya Plaza",
"address": {
"countryCode": "IND",
"city": "Chennai",
"postalCode": "600017",
"street": "Sir Thyagaraya Road",
"house": ""
},
"position": [
13.041404800089397,
80.23480899848522
],
"distance": 6860.646286724997,
"type": "urn:nlp-types:venue",
"vicinity": "Sir Thyagaraya Road,600017,Chennai,IND",
"bbox": [
[
13.041557002816027,
80.23472596161558
],
[
13.04125261448761,
80.23489217568006
]
],
"minFloor": 0,
"maxFloor": 4,
"namespace": "public"
},
{
"id": "DM_3866",
"title": "Challa Mall",
"address": {
"countryCode": "IND",
"city": "Chennai",
"postalCode": "600017",
"street": "Sir Thyagaraya Road",
"house": ""
},
"position": [
13.040501949969517,
80.24325910031074
],
"distance": 7183.4301593814025,
"type": "urn:nlp-types:venue",
"vicinity": "Sir Thyagaraya Road,600017,Chennai,IND",
"bbox": [
[
13.040704496188196,
80.24306093132118
],
[
13.040299554031115,
80.24345735684514
]
],
"minFloor": -1,
"maxFloor": 1,
"namespace": "public"
},
{
"id": "DM_3871",
"title": "Kasi Arcade Mall",
"address": {
"countryCode": "IND",
"city": "Chennai",
"postalCode": "600017",
"street": "Sir Thyagaraya Road",
"house": ""
},
"position": [
13.040300249964666,
80.24435859999508
],
"distance": 7224.9813794400025,
"type": "urn:nlp-types:venue",
"vicinity": "Sir Thyagaraya Road,600017,Chennai,IND",
"bbox": [
[
13.040532567087016,
80.24415738929856
],
[
13.04006805606027,
80.24455999517599
]
],
"minFloor": -1,
"maxFloor": 1,
"namespace": "public"
},
I had copied the lat/long from google maps, then I realized that the longitude has space, in the beginning, I removed the space and it started to work!
I am able to get all the child nodes and its related information under a parent node but in a array of objects format , for the query
g.V(4128).repeat(out()).emit()
[
{
"id": 4152.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "1l3-37c-1l1",
"value": "XYZ"
}
],
"description": [
{
"id": "1zb-37c-7wl",
"value": "XYZ World"
}
],
"shortName": [
{
"id": "16v-37c-745",
"value": "XYZ"
}
]
}
},
{
"id": 4176.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "1l6-380-1l1",
"value": "XYZ-XYZW"
}
],
"description": [
{
"id": "1ze-380-7wl",
"value": "XYZ West Campus"
}
],
"shortName": [
{
"id": "16y-380-745",
"value": "XYZW"
}
]
}
},
{
"id": 8344.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "3kj-6fs-1l1",
"value": "XYZ-XYZE"
}
],
"description": [
{
"id": "3yr-6fs-7wl",
"value": "XYZ East Campus"
}
],
"shortName": [
{
"id": "36b-6fs-745",
"value": "XYZE"
}
]
}
},
{
"id": 4104.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "1kx-360-1l1",
"value": "XYZ-XYZW-P1"
}
],
"description": [
{
"id": "1z5-360-7wl",
"value": "XYZ West Campus-Phase-1"
}
],
"shortName": [
{
"id": "16p-360-745",
"value": "P1"
}
]
}
},
{
"id": 4296.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "1ll-3bc-1l1",
"value": "XYZ-XYZW-P3"
}
],
"description": [
{
"id": "1zt-3bc-7wl",
"value": "XYZ West Campus-Phase-3"
}
],
"shortName": [
{
"id": "17d-3bc-745",
"value": "P3"
}
]
}
},
{
"id": 8200.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "3k1-6bs-1l1",
"value": "XYZ-XYZW-P2"
}
],
"description": [
{
"id": "3y9-6bs-7wl",
"value": "XYZ West Campus-Phase-2"
}
],
"shortName": [
{
"id": "35t-6bs-745",
"value": "P2"
}
]
}
},
{
"id": 8224.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "3yc-6cg-1l1",
"value": "XYZ-XYZE-P1"
}
],
"description": [
{
"id": "4ck-6cg-7wl",
"value": "XYZ East Campus-Phase-1"
}
],
"shortName": [
{
"id": "3k4-6cg-745",
"value": "P1"
}
]
}
},
{
"id": 8392.0,
"label": "location",
"type": "vertex",
"properties": {
"displayName": [
{
"id": "3kp-6h4-1l1",
"value": "XYZ-XYZE-P2"
}
],
"description": [
{
"id": "3yx-6h4-7wl",
"value": "XYZ East Campus-Phase-2"
}
],
"shortName": [
{
"id": "36h-6h4-745",
"value": "P2"
}
]
}
}
]
I need to get the same information in hierarchial way .
I tried the following query
g.V(4128).repeat(out()).emit().tree().by(__.valueMap(true))
but I don't get the valid json.
I need to get the above data but in hierarchical way
Updated
I tried the following query
g.V(4128).repeat(out()).emit().tree().by(__.valueMap(true))
And the response I received was
[
{
"{label = org, name = [XYZ], orgId = [00000000-0000-0000-0000-000000000001], desc = [XYZ Organization], id = 4128}": {
"{label = location, displayName = [hh], description = [hfds], shortName = [kk], id = 8272}": {
},
"{label = location, displayName = [XYZ], description = [XYZ World], shortName = [XYZ], id = 4152}": {
"{label = location, displayName = [XYZ-XYZW], description = [XYZ West Campus], shortName = [XYZW], id = 4176}": {
"{label = location, displayName = [XYZ-XYZW-P3], description = [XYZ West Campus-Phase-3], shortName = [P3], id = 4296}": {
},
"{label = location, displayName = [XYZ-XYZW-P2], description = [XYZ West Campus-Phase-2], shortName = [P2], id = 8200}": {
},
"{label = location, displayName = [XYZ-XYZW-P1], description = [XYZ West Campus-Phase-1], shortName = [P1], id = 4104}": {
}
},
"{label = location, displayName = [XYZ-XYZE], description = [XYZ East Campus], shortName = [XYZE], id = 8344}": {
"{label = location, displayName = [XYZ-XYZE-P1], description = [XYZ East Campus-Phase-1], shortName = [P1], id = 8224}": {
},
"{label = location, displayName = [XYZ-XYZE-P2], description = [XYZ East Campus-Phase-2], shortName = [P2], id = 8392}": {
}
}
},
"{label = location, displayName = [hh], description = [hfds], shortName = [kk], id = 8248}": {
},
"{label = location, displayName = [hh], description = [hfds], shortName = [kk], id = 12488}": {
}
}
}
]
Now as you can see the json so received is not appropriate because the key contains fields that are '=' separated .
Now as for the answer I also tried the folowing query
g.V(4128).repeat(out()).emit().tree().next()
but the response returned only ids and didnt resolve the vertex properties
[
{
"4128": {
"8272": {},
"4152": {
"4176": {
"4104": {},
"4296": {},
"8200": {}
},
"8344": {
"8224": {},
"8392": {}
}
},
"8248": {},
"12488": {}
}
}
]
For the context I am using the following configurations in my gremlin-server.yaml file
authentication: {className: org.apache.tinkerpop.gremlin.server.auth.AllowAllAuthenticator,
config: null}
channelizer: org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer
graphs: {graph: 'D:/graph-data-access/src/test/resources/titan-inmemory.properties'}
gremlinPool: 8
host: localhost
maxAccumulationBufferComponents: 1024
maxChunkSize: 8192
maxContentLength: 65536
maxHeaderSize: 8192
maxInitialLineLength: 4096
metrics:
consoleReporter: null
csvReporter: null
gangliaReporter: null
graphiteReporter: null
jmxReporter: null
slf4jReporter: {enabled: true, interval: 180000, loggerName: org.apache.tinkerpop.gremlin.server.Settings$Slf4jReporterMetrics}
plugins: [aurelius.titan, tinkerpop.gephi]
port: 8182
processors: []
resultIterationBatchSize: 64
scriptEngines:
gremlin-groovy:
config: null
imports: [java.lang.Math]
scripts: ['D:/graph-data-access/src/test/resources/generate-locations.groovy']
staticImports: [java.lang.Math.PI]
scriptEvaluationTimeout: 30000
serializedResponseTimeout: 30000
serializers:
- className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0
config: {useMapperFromGraph: graph}
- className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0
config: {serializeResultToString: true}
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0
config: {useMapperFromGraph: graph}
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0
config: {useMapperFromGraph: graph}
ssl: {enabled: false, keyCertChainFile: null, keyFile: null, keyPassword: null, trustCertChainFile: null}
threadPoolBoss: 1
threadPoolWorker: 1
writeBufferHighWaterMark: 65536
writeBufferLowWaterMark: 32768
I am using Tinkerpop version 3.0.1 incubating as I am trying to use Titan 1.0.0 with DynamoDb as storage backend for the remote connection.
Not sure what you mean by "but i don't get valid json". You should be able to serialized a Tree in GraphSON 1.0 if you don't include by(valueMap(true)) and just serialize the full vertex. There is a failure if you try to do it as just maps as it makes some assumptions about there being a graph Element as the key (which is probably bad).
gremlin> mapper = graph.io(graphson()).mapper().version(GraphSONVersion.V1_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper#6b2e0f78
gremlin> mapper.writeValueAsString(g.V(1).repeat(out()).emit().tree().next())
==>{"1":{"key":{"id":1,"label":"vertex","type":"vertex","properties":{"name":[{"id":0,"value":"marko"}],"age":[{"id":2,"value":29}]}},"value":{"2":{"key":{"id":2,"label":"vertex","type":"vertex","properties":{"name":[{"id":3,"value":"vadas"}],"age":[{"id":4,"value":27}]}},"value":{}},"3":{"key":{"id":3,"label":"vertex","type":"vertex","properties":{"name":[{"id":5,"value":"lop"}],"lang":[{"id":6,"value":"java"}]}},"value":{}},"4":{"key":{"id":4,"label":"vertex","type":"vertex","properties":{"name":[{"id":7,"value":"josh"}],"age":[{"id":8,"value":32}]}},"value":{"3":{"key":{"id":3,"label":"vertex","type":"vertex","properties":{"name":[{"id":5,"value":"lop"}],"lang":[{"id":6,"value":"java"}]}},"value":{}},"5":{"key":{"id":5,"label":"vertex","type":"vertex","properties":{"name":[{"id":9,"value":"ripple"}],"lang":[{"id":10,"value":"java"}]}},"value":{}}}}}}}
That formats to:
{
"1": {
"key": {
"id": 1,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 0,
"value": "marko"
}],
"age": [{
"id": 2,
"value": 29
}]
}
},
"value": {
"2": {
"key": {
"id": 2,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 3,
"value": "vadas"
}],
"age": [{
"id": 4,
"value": 27
}]
}
},
"value": {}
},
"3": {
"key": {
"id": 3,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 5,
"value": "lop"
}],
"lang": [{
"id": 6,
"value": "java"
}]
}
},
"value": {}
},
"4": {
"key": {
"id": 4,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 7,
"value": "josh"
}],
"age": [{
"id": 8,
"value": 32
}]
}
},
"value": {
"3": {
"key": {
"id": 3,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 5,
"value": "lop"
}],
"lang": [{
"id": 6,
"value": "java"
}]
}
},
"value": {}
},
"5": {
"key": {
"id": 5,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 9,
"value": "ripple"
}],
"lang": [{
"id": 10,
"value": "java"
}]
}
},
"value": {}
}
}
}
}
}
}
In GraphSON 2.0 you get this:
gremlin> mapper = graph.io(graphson()).mapper().version(GraphSONVersion.V2_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper#3ffb3598
gremlin> mapper.writeValueAsString(g.V(1).repeat(out()).emit().tree().next())
==>{"#type":"g:Tree","#value":[{"key":{"#type":"g:Vertex","#value":{"id":{"#type":"g:Int32","#value":1},"label":"vertex","properties":{"name":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":0},"value":"marko","label":"name"}}],"age":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":2},"value":{"#type":"g:Int32","#value":29},"label":"age"}}]}}},"value":{"#type":"g:Tree","#value":[{"key":{"#type":"g:Vertex","#value":{"id":{"#type":"g:Int32","#value":2},"label":"vertex","properties":{"name":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":3},"value":"vadas","label":"name"}}],"age":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":4},"value":{"#type":"g:Int32","#value":27},"label":"age"}}]}}},"value":{"#type":"g:Tree","#value":[]}},{"key":{"#type":"g:Vertex","#value":{"id":{"#type":"g:Int32","#value":3},"label":"vertex","properties":{"name":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":5},"value":"lop","label":"name"}}],"lang":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":6},"value":"java","label":"lang"}}]}}},"value":{"#type":"g:Tree","#value":[]}},{"key":{"#type":"g:Vertex","#value":{"id":{"#type":"g:Int32","#value":4},"label":"vertex","properties":{"name":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":7},"value":"josh","label":"name"}}],"age":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":8},"value":{"#type":"g:Int32","#value":32},"label":"age"}}]}}},"value":{"#type":"g:Tree","#value":[{"key":{"#type":"g:Vertex","#value":{"id":{"#type":"g:Int32","#value":3},"label":"vertex","properties":{"name":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":5},"value":"lop","label":"name"}}],"lang":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":6},"value":"java","label":"lang"}}]}}},"value":{"#type":"g:Tree","#value":[]}},{"key":{"#type":"g:Vertex","#value":{"id":{"#type":"g:Int32","#value":5},"label":"vertex","properties":{"name":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":9},"value":"ripple","label":"name"}}],"lang":[{"#type":"g:VertexProperty","#value":{"id":{"#type":"g:Int32","#value":10},"value":"java","label":"lang"}}]}}},"value":{"#type":"g:Tree","#value":[]}}]}}]}}]}
which formats as:
{
"#type": "g:Tree",
"#value": [{
"key": {
"label": "vertex",
"name": ["marko"],
"id": {
"#type": "g:Int32",
"#value": 1
},
"age": [{
"#type": "g:Int32",
"#value": 29
}]
},
"value": {
"#type": "g:Tree",
"#value": [{
"key": {
"label": "vertex",
"name": ["lop"],
"id": {
"#type": "g:Int32",
"#value": 3
},
"lang": ["java"]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}, {
"key": {
"label": "vertex",
"name": ["vadas"],
"id": {
"#type": "g:Int32",
"#value": 2
},
"age": [{
"#type": "g:Int32",
"#value": 27
}]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}, {
"key": {
"label": "vertex",
"name": ["josh"],
"id": {
"#type": "g:Int32",
"#value": 4
},
"age": [{
"#type": "g:Int32",
"#value": 32
}]
},
"value": {
"#type": "g:Tree",
"#value": [{
"key": {
"label": "vertex",
"name": ["ripple"],
"id": {
"#type": "g:Int32",
"#value": 5
},
"lang": ["java"]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}, {
"key": {
"label": "vertex",
"name": ["lop"],
"id": {
"#type": "g:Int32",
"#value": 3
},
"lang": ["java"]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}]
}
}]
}
}]
}
Note that you can also use by(valueMap(true)) in the case of GraphSON 2.0:
gremlin> mapper.writeValueAsString(g.V(1).repeat(out()).emit().tree().by(valueMap(true)).next())
==>{"#type":"g:Tree","#value":[{"key":{"label":"vertex","name":["marko"],"id":{"#type":"g:Int32","#value":1},"age":[{"#type":"g:Int32","#value":29}]},"value":{"#type":"g:Tree","#value":[{"key":{"label":"vertex","name":["lop"],"id":{"#type":"g:Int32","#value":3},"lang":["java"]},"value":{"#type":"g:Tree","#value":[]}},{"key":{"label":"vertex","name":["vadas"],"id":{"#type":"g:Int32","#value":2},"age":[{"#type":"g:Int32","#value":27}]},"value":{"#type":"g:Tree","#value":[]}},{"key":{"label":"vertex","name":["josh"],"id":{"#type":"g:Int32","#value":4},"age":[{"#type":"g:Int32","#value":32}]},"value":{"#type":"g:Tree","#value":[{"key":{"label":"vertex","name":["ripple"],"id":{"#type":"g:Int32","#value":5},"lang":["java"]},"value":{"#type":"g:Tree","#value":[]}},{"key":{"label":"vertex","name":["lop"],"id":{"#type":"g:Int32","#value":3},"lang":["java"]},"value":{"#type":"g:Tree","#value":[]}}]}}]}}]}
which formats to:
{
"#type": "g:Tree",
"#value": [{
"key": {
"label": "vertex",
"name": ["marko"],
"id": {
"#type": "g:Int32",
"#value": 1
},
"age": [{
"#type": "g:Int32",
"#value": 29
}]
},
"value": {
"#type": "g:Tree",
"#value": [{
"key": {
"label": "vertex",
"name": ["lop"],
"id": {
"#type": "g:Int32",
"#value": 3
},
"lang": ["java"]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}, {
"key": {
"label": "vertex",
"name": ["vadas"],
"id": {
"#type": "g:Int32",
"#value": 2
},
"age": [{
"#type": "g:Int32",
"#value": 27
}]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}, {
"key": {
"label": "vertex",
"name": ["josh"],
"id": {
"#type": "g:Int32",
"#value": 4
},
"age": [{
"#type": "g:Int32",
"#value": 32
}]
},
"value": {
"#type": "g:Tree",
"#value": [{
"key": {
"label": "vertex",
"name": ["ripple"],
"id": {
"#type": "g:Int32",
"#value": 5
},
"lang": ["java"]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}, {
"key": {
"label": "vertex",
"name": ["lop"],
"id": {
"#type": "g:Int32",
"#value": 3
},
"lang": ["java"]
},
"value": {
"#type": "g:Tree",
"#value": []
}
}]
}
}]
}
}]
}
If you are on older version of TinkerPop going back to 3.0.x, then there are some limitations with tree that aren't easily worked around. The only approach is to take a raw tree and post-process it to get it to a form that is friendly to JSON. Here is one way to do that:
gremlin> convert = { it.collectEntries{ k,v -> [(k.id()): [k, v.isEmpty() ? v : convert(v)]] }}
==>groovysh_evaluate$_run_closure1#255e5e2e
gremlin> t = g.V(1).repeat(out()).emit().tree().next()
==>v[1]={v[2]={}, v[3]={}, v[4]={v[3]={}, v[5]={}}}
gremlin> convert(t)
==>1=[v[1], {2=[v[2], {}], 3=[v[3], {}], 4=[v[4], {3=[v[3], {}], 5=[v[5], {}]}]}]
gremlin> mapper.writeValueAsString(convert(t))
==>{"1":[{"id":1,"label":"vertex","type":"vertex","properties":{"name":[{"id":0,"value":"marko"}],"age":[{"id":2,"value":29}]}},{"2":[{"id":2,"label":"vertex","type":"vertex","properties":{"name":[{"id":3,"value":"vadas"}],"age":[{"id":4,"value":27}]}},{}],"3":[{"id":3,"label":"vertex","type":"vertex","properties":{"name":[{"id":5,"value":"lop"}],"lang":[{"id":6,"value":"java"}]}},{}],"4":[{"id":4,"label":"vertex","type":"vertex","properties":{"name":[{"id":7,"value":"josh"}],"age":[{"id":8,"value":32}]}},{"3":[{"id":3,"label":"vertex","type":"vertex","properties":{"name":[{"id":5,"value":"lop"}],"lang":[{"id":6,"value":"java"}]}},{}],"5":[{"id":5,"label":"vertex","type":"vertex","properties":{"name":[{"id":9,"value":"ripple"}],"lang":[{"id":10,"value":"java"}]}},{}]}]}]}
This formats in GraphSON 1.0 (which is what is used in 3.0.x) to:
{
"1": [{
"id": 1,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 0,
"value": "marko"
}],
"age": [{
"id": 2,
"value": 29
}]
}
}, {
"2": [{
"id": 2,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 3,
"value": "vadas"
}],
"age": [{
"id": 4,
"value": 27
}]
}
}, {}],
"3": [{
"id": 3,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 5,
"value": "lop"
}],
"lang": [{
"id": 6,
"value": "java"
}]
}
}, {}],
"4": [{
"id": 4,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 7,
"value": "josh"
}],
"age": [{
"id": 8,
"value": 32
}]
}
}, {
"3": [{
"id": 3,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 5,
"value": "lop"
}],
"lang": [{
"id": 6,
"value": "java"
}]
}
}, {}],
"5": [{
"id": 5,
"label": "vertex",
"type": "vertex",
"properties": {
"name": [{
"id": 9,
"value": "ripple"
}],
"lang": [{
"id": 10,
"value": "java"
}]
}
}, {}]
}]
}]
}
The convert() function i created just recursively iterates the tree and turns every [vertex: children] into [vertexId: [vertex,children]. You can convert to whatever format you like, so long as you build valid JSON where there is a usable String key field. I could have just as easily made the convert() function return [vertexId: [node: vertex, leaves: children]:
gremlin> convert = { it.collectEntries{ k,v -> [(k.id()): [node: k, leaves:v.isEmpty() ? v : convert(v)]] }}
==>groovysh_evaluate$_run_closure1#2ab5afc7
gremlin> mapper.writeValueAsString(convert(t))
==>{"1":{"node":{"id":1,"label":"vertex","type":"vertex","properties":{"name":[{"id":0,"value":"marko"}],"age":[{"id":2,"value":29}]}},"leaves":{"2":{"node":{"id":2,"label":"vertex","type":"vertex","properties":{"name":[{"id":3,"value":"vadas"}],"age":[{"id":4,"value":27}]}},"leaves":{}},"3":{"node":{"id":3,"label":"vertex","type":"vertex","properties":{"name":[{"id":5,"value":"lop"}],"lang":[{"id":6,"value":"java"}]}},"leaves":{}},"4":{"node":{"id":4,"label":"vertex","type":"vertex","properties":{"name":[{"id":7,"value":"josh"}],"age":[{"id":8,"value":32}]}},"leaves":{"3":{"node":{"id":3,"label":"vertex","type":"vertex","properties":{"name":[{"id":5,"value":"lop"}],"lang":[{"id":6,"value":"java"}]}},"leaves":{}},"5":{"node":{"id":5,"label":"vertex","type":"vertex","properties":{"name":[{"id":9,"value":"ripple"}],"lang":[{"id":10,"value":"java"}]}},"leaves":{}}}}}}}