public <VT> List<VertexIdValue<VT>> queryWithValues(int vertexId, BytesToValueConverter<VT> conv) throws
                IOException {

            List<VertexIdValue<VT>> results = new ArrayList<VertexIdValue<VT>>();
            ShardIndex.IndexEntry entry = index.lookup(vertexId);

            int curvid = entry.vertex;
            int adjOffset = entry.fileOffset;
            int edgeOffset = entry.edgePointer;
            String edataShardName = ChiFilenames.getFilenameShardEdata(fileName, conv, shardNum, numShards);
            int fileSize = ChiFilenames.getShardEdataSize(edataShardName);


            adjFile.seek(adjOffset);

            /* Edge data block*/
            int blockSize = ChiFilenames.getBlocksize(conv.sizeOf());

            byte[] edgeDataBlock = new byte[blockSize];
            int curBlockId = (-1);
            byte[] tmp = new byte[conv.sizeOf()];

            while(curvid <= vertexId) {
                int n;
                int ns = adjFile.readUnsignedByte();
                assert(ns >= 0);
                adjOffset++;

                if (ns == 0) {
                    curvid++;
                    int nz = adjFile.readUnsignedByte();

                    adjOffset++;
                    assert(nz >= 0);
                    curvid += nz;
                    continue;
                }

                if (ns == 0xff) {
                    n = adjFile.readInt();
                    adjOffset += 4;
                } else {
                    n = ns;
                }

                if (curvid == vertexId) {
                    while (--n >= 0) {
                        int target = adjFile.readInt();

                        int blockId = edgeOffset * conv.sizeOf() / blockSize;
                        if (blockId != curBlockId) {
                            String blockFileName = ChiFilenames.getFilenameShardEdataBlock(
                                    edataShardName,
                                    blockId, blockSize);
                            curBlockId = blockId;
                            int len = Math.min(blockSize, fileSize - blockId * blockSize);
                            CompressedIO.readCompressed(new File(blockFileName), edgeDataBlock, len);
                        }
                        System.arraycopy(edgeDataBlock, (edgeOffset * conv.sizeOf()) % blockSize, tmp, 0, conv.sizeOf());
                        VT value = conv.getValue(tmp);
                        results.add(new VertexIdValue<VT>(target, value));
                        edgeOffset++;
                    }
                } else {
                    adjFile.skipBytes(n * 4);
                    edgeOffset += n;
                }
                curvid++;
            }
            return results;
        }