The fact web
is represented as linked data serialized as JSON-LD. We find facts by crawling - just like a search engine.
A published
fact is published on the Internet as an https://
resource, just like any web page.
Each fact-ready website hosts a fact claims file, you can start with our fact.claims.
The full process looks like this - it's not quite some complicated as it first appears:
sequenceDiagram
participant Agent
participant FactCrawler
participant IPFS
Agent ->> FactCrawler: Start crawling process
FactCrawler ->> IPFS: Request root node (IPFS URI)
IPFS -->> FactCrawler: Send root node data
FactCrawler ->> FactCrawler: Load grounded facts from IPFS
FactCrawler ->> FactCrawler: Follow chain of trust
Note over FactCrawler: Iterate through associated and generated facts
FactCrawler ->> IPFS: Request grounded facts
IPFS -->> FactCrawler: Send grounded facts
FactCrawler ->> FactCrawler: Merge facts into graph
FactCrawler ->> FactCrawler: Traverse to secondary facts
Note over FactCrawler: Optionally fetch facts from public URLs
FactCrawler ->> IPFS: Request secondary facts
IPFS -->> FactCrawler: Send secondary facts
FactCrawler ->> FactCrawler: Merge secondary facts into graph
FactCrawler ->> FactCrawler: Validate claims using SHACL
Note over FactCrawler: Ensure facts conform to fact.claims SHACL
grounded
crawl must start with an immutable ipfs://root-hash
URL.ipfs://
for grounded
facts).prov:wasAssociatedWith
and prov:wasGeneratedBy
.https://
) or grounded (ipfs://
).
handle with care
).fact.claims
SHACL specification.graph TD;
A[Start] --> C{Is IPFS?};
C -->|Yes| D[Load from IPFS];
C -->|No| E[Not Trusted];
D --> F[Follow Chain of Custody];
F --> G[Lookup Facts];
G --> H{Facts Found?};
H -->|Yes| I[from public URLs];
H -->|No| J[Validate using SHACL];
I --> J;
J --> K[End: Crawl Complete];
E --> K;
K --> L{Success?};
L -->|Yes| M[Report];
L -->|No| N[Repair];
M --> O[End];
N --> O[End];
Use case | Open source |
---|---|
IPFS Integration | js-ipfs for JavaScript or py-ipfs for Python or Java IPFS API for Java |
RDF Representation | Apache Jena for Java or RDFLib for Python |
Smart Contract Integration | Web3.js for JavaScript or Web3.py for Python |
SHACL Validation | TopQuadrant SHACL or Eclipse RDF4J SHACL |