public function searchBy($property, $value = null, $lang = 'en', $limit = 10) 
    {
        if(!is_pid($property)) {
            throw new Exception("First argument in searchBy() must be a valid Wikidata property ID (e.g.: P646).", 1);
        }

        if(!$value) {
            throw new Exception("Second argument in searchBy() must be a string or a valid Wikidata entity ID (e.g.: Q646).", 1);
        }

        $subject = is_qid($value) ? 'wd:'.$value : '"'.$value.'"';

        $query = '
            SELECT ?item ?itemLabel ?itemAltLabel ?itemDescription WHERE {
                ?item wdt:'.$property.' '.$subject.'.
                SERVICE wikibase:label {
                    bd:serviceParam wikibase:language "'. $lang .'".
                }
            } LIMIT '.$limit.'
        ';

        $client = new SparqlClient();

        $data = $client->execute( $query ); 

        $collection = collect($data);

        $output = $collection->map(function($item) use ($lang) {
            return new SearchResult($item, $lang, 'sparql');
        });

        return $output;
    }