Package: rdfhash
rdfhash: RDF Graph Compression Toolrdfhashis a utility for RDF graph compression that works by hashing RDF subjects based on a checksum of their triples, effectively minimizing the size of RDF graphs by consolidating subjects that have identical definitions.InstallationYou can installrdfhashusingpip, a package manager for Python. Ensurepythonandpipare properly installed on your system, then run the following command:pipinstallrdfhashUsageCommand Line Interface (CLI)Basic UsageBy default, all blank nodes in atext/turtlefile or string are replaced by their hashed definition:rdfhash'@prefix hash: <http://rdfhash.com/ontology/> .[ ] a hash:Attribute ;hash:unit hash:unit:Centimeters ;hash:value 5.38 .'Output:@prefix hash:<http://rdfhash.com/ontology/> .<sha256:960891b4b1856b4d2c24b977f75d497e4da9e6f147a292524ae51db5fd0e864e>a hash:Attribute ;hash:unit <http://rdfhash.com/ontology/unit:Centimeters> ;hash:value 5.38 .Advanced UsageTherdfhashtool is highly customizable and can be tailored to fit the requirements of any organization:rdfhash'@prefix hash: <http://rdfhash.com/ontology/> .@prefix md5: <http://rdfhash.com/instances/md5/> .[ ] a hash:Contact ;hash:phone "487-538-2824" ;hash:email "johnsmith@example.com" ;hash:name [a hash:LegalName ;hash:firstName "John" ;hash:lastName "Smith" ;] ;hash:address [a hash:Address ;hash:street "4567 Mountain Peak Way" ;hash:city "Denver" ;hash:state "CO" ;hash:zip "80202" ;hash:country "USA" ;] ;.'\--methodmd5\--template'http://rdfhash.com/instances/{method}/{value}'\--sparql'prefix hash: <http://rdfhash.com/ontology/>select ?s where {?s a ?type .VALUES ?type {hash:Contacthash:LegalNamehash:Address}}'--methodspecifies the hashing algorithm to use. The default issha256.--templatespecifies the URI template to use for hashed subjects. The default is{method}:{value}.--sparqlspecifies the SPARQL query to use for selecting subjects to hash. The default isSELECT ?s WHERE { ?s ?p ?o . FILTER(isBlank(?s))}(Selecting all Blank Node subjects).Runrdfhash --helpfor more information on available parameters.Output:@prefix hash:<http://rdfhash.com/ontology/> .@prefix md5:<http://rdfhash.com/instances/md5/> .md5:8fc18e400ff531e5cbe02fef751662baa hash:Contact ;hash:phone "487-538-2824" ;hash:email "johnsmith@example.com" ;hash:name md5:5fd42f2c072c80e3db760c3fc69b91b8 ;hash:address md5:9a3e3ce644e2c5271015d9665675a8e5 .md5:5fd42f2c072c80e3db760c3fc69b91b8a hash:LegalName ;hash:firstName "John" ;hash:lastName "Smith" .md5:9a3e3ce644e2c5271015d9665675a8e5a hash:Address ;hash:street "4567 Mountain Peak Way" ;hash:city "Denver" ;hash:state "CO" ;hash:zip "80202" ;hash:country "USA" .Import as a Python Modulefromrdfhashimporthash_subjectsdata='''@prefix hash: <http://rdfhash.com/ontology/> .@prefix sha1: <http://rdfhash.com/instances/sha1/> .<http://rdfhash.com/instances/Meaning-of-Life>a hash:Attribute ;hash:value 42 .'''graph,subjects_replaced=hash_subjects(data,method='sha1',template='http://rdfhash.com/instances/{method}/{value}',sparql_select_subjects='''prefix hash: <http://rdfhash.com/ontology/>SELECT ?s WHERE { ?s a hash:Attribute. }''')print(graph.serialize(format='turtle'))Output:@prefix hash:<http://rdfhash.com/ontology/> .@prefix sha1:<http://rdfhash.com/instances/sha1/> .sha1:4afe716d630b17d5a5d06f0901800e16f3e8c9a4a hash:Attribute ;hash:value 42 .LimitationsIt's important to note whererdfhashis limited in its functionality. These limitations are expected to be addressed in future versions.Therdfhashtool does not yet fully support Named Graphs (e.g.text/trigorapplication/n-quads)Users can still attempt to pass RDF data containing Named Graphs, although the expected output has not yet been tested.Circular dependencies between selected subjects are currently not allowed. (e.g. Inverse properties). ADirected Acyclic Graph (DAG)is required at the moment.Best practice to follow is prioritizing broader-to-narrower relationships. (e.g. A personContactpoints toLegalNameandAddressand not inversely. Multiple contacts can point to the sameLegalNameorAddress.)Futurerdfhashversions will support ignoring specific properties used in a subject's hash, allowing the use of inverse properties.Currently, selected subjects are expected to be fully defined in the input graph.Futurerdfhashversions will support connections to a SPARQL endpoint to fetch full context for hashing.