{"id":19618928,"url":"https://github.com/jhb/paragraph","last_synced_at":"2026-04-07T16:31:56.283Z","repository":{"id":136985396,"uuid":"258460200","full_name":"jhb/paragraph","owner":"jhb","description":"graph management system for labeled property graphs","archived":false,"fork":false,"pushed_at":"2020-11-07T07:55:17.000Z","size":1337,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-03-06T05:00:26.841Z","etag":null,"topics":["flask","graph-database","neo4j","python","ui","zodb"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jhb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-24T09:01:04.000Z","updated_at":"2020-11-07T07:53:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"75136847-d2f2-4200-b85a-b7cd8f6bb59e","html_url":"https://github.com/jhb/paragraph","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jhb/paragraph","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhb%2Fparagraph","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhb%2Fparagraph/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhb%2Fparagraph/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhb%2Fparagraph/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jhb","download_url":"https://codeload.github.com/jhb/paragraph/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhb%2Fparagraph/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31520463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flask","graph-database","neo4j","python","ui","zodb"],"created_at":"2024-11-11T11:11:23.111Z","updated_at":"2026-04-07T16:31:56.264Z","avatar_url":"https://github.com/jhb.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# paragraph\ncms for labeled property graphs \n\nUsage example from neo4j:\n\n    \u003e\u003e\u003e from paragraph.NeoGraphDB import NeoGraphDB\n    \u003e\u003e\u003e db = NeoGraphDB()\n    \u003e\u003e\u003e alice = db.add_node('Person', name='alice')\n\nAlice is a node. Nodes have a unique id and labels:\n\n    \u003e\u003e\u003e alice\n    (Person ... alice)\n\nBut a note also stores properties like a dictionary:\n\n    \u003e\u003e\u003e dict(alice)\n    {'_id': '...', 'name': 'alice'}\n    \u003e\u003e\u003e alice.id == alice['_id']\n    True\n\nWhy does id show up in the node properties, but not the labels? Because at least for neo4j labels\nare stored on nodes anyhow, but id needs to be stored \"manually\", hence the property with the\nspecial marker for technical attributes, the underscore \"_\".\n\nNow lets link alice to bob:\n\n    \u003e\u003e\u003e bob = db.add_node('Person', name='bob')\n    \u003e\u003e\u003e edge = db.add_edge(alice, 'friend_of', bob, foo='bar')\n    \u003e\u003e\u003e edge.id\n    '...'\n    \u003e\u003e\u003e edge.source == alice\n    True\n    \u003e\u003e\u003e edge.target == bob\n    True\n    \u003e\u003e\u003e edge.reltype\n    'friend_of'\n\n\nAnd again, all other properties are stored dictionary-style in the edge:\n\n    \u003e\u003e\u003e edge\n    (Person ... alice) --[friend_of]--\u003e (Person ... bob)\n    \u003e\u003e\u003e dict(edge)\n    {'_id': '...', 'foo': 'bar'}\n\nLets move from alice one hop outwards:\n\n    \u003e\u003e\u003e nodes = alice.oN('friend_of').nodes\n    \u003e\u003e\u003e nodes == {bob}\n    True\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjhb%2Fparagraph","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjhb%2Fparagraph","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjhb%2Fparagraph/lists"}