Skip to main content

sgraph

sgraph contains data format, structures and algorithms to work with hierarchic graph structures. Typically it is suitable for representing software architectures.

Documentation: https://softagram.github.io/sgraph/

See also sgraph-mcp-server for enabling AI agents to utilize sgraph information.

Install

pip install sgraph

Contributions

The project is welcoming all contributions.

Core Ontology

A model, SGraph consists of a root SElement, which may have children of the same type (as in XML). Attribute information can be stored via key-value pairs into them. The SElement objects can be connected together via SElementAssociation objects.

Example model

nginx model has an nginx root element that represents the main directory. Inside it, there is a src element. And inside src, there is core.

https://github.com/nginx/nginx/tree/master/src inside core, there are several elements, e.g. nginx.c and nginx.h

https://github.com/nginx/nginx/blob/master/src/core/nginx.c

Because nginx.c contains #include directive to nginx.h, in the model it is formulated so that there is a relationship (also called as association) from nginx.c element to nginx.h

To make model more explicit, that particular relationship should be annotated with type "inc" to describe the dependency type.

It is also possible to have other attributes assigned to relationships other than type but typically this is rare.

XML format

In XML dataformat, minimalism is the goal to make it simple and clean. Integers are used as unique identifiers for the elements. In the example case, the nginx.h element is assigned with ID 2 and the relationship that is inside nginx.c refers this way to nginx.h

This integer reference system has been designed to make the data format highly performing even with 10 million element models.

Deps data format - line based simple format for easy scripting

In Deps data format (usually a .txt file), the above model can be described minimally this way:

/nginx/src/core/nginx.c:/nginx/src/core/nginx.h:inc

Although this might seem very compelling data format to use, it is not recommended for very large models, e.g. 10 million elements.

Using the API

Creating a simple model:

>>> from sgraph import SGraph
>>> from sgraph import SElement
>>> from sgraph import SElementAssociation
>>> x = SGraph(SElement(None, ''))
>>> x
<SGraph empty elements=0 id=0x7f2efae9ad30>

>>> x.to_deps(fname=None)

>>> e1 = x.createOrGetElementFromPath('/path/to/file.x')
>>> e2 = x.createOrGetElementFromPath('/path/to/file.y')
>>> x.to_deps(fname=None)
/path
/path/to
/path/to/file.x
/path/to/file.y

>>> x.to_xml(fname=None)
<model version="2.1">
  <elements>
  <e n="path" >
    <e n="to" >
      <e n="file.x" >
      </e>
      <e n="file.y" >
      </e>
    </e>
  </e>
</elements>
</model>

>>> ea = SElementAssociation(e1, e2, 'use')
>>> ea.initElems()  # ea is not connected to the model before this call.
>>> x.to_deps(fname=None)
/path/to/file.x:/path/to/file.y:use
/path
/path/to
>>>

>>> x.to_xml(fname=None)
<model version="2.1">
  <elements>
  <e n="path" >
    <e n="to" >
      <e n="file.x" >
        <r r="2" t="use" />
      </e>
      <e i="2" n="file.y" >
      </e>
    </e>
  </e>
 </elements>
</model>

Querying with Cypher

Models can be queried using the openCypher graph query language (requires optional dependency spycy-aneeshdurg):

from sgraph import SGraph
from sgraph.cypher import cypher_query

model = SGraph.parse_xml_or_zipped_xml('model.xml')
results = cypher_query(model, 'MATCH (a)-[r:inc]->(b) RETURN a.name, b.name')

A CLI with interactive REPL is also available:

pip install spycy-aneeshdurg
python -m sgraph.cypher model.xml.zip 'MATCH (n:file) RETURN n.name'   # single query
python -m sgraph.cypher model.xml.zip                                   # interactive REPL
python -m sgraph.cypher model.xml.zip -f dot 'MATCH (a)-[r]->(b) RETURN a, r, b' | dot -Tpng -o graph.png

See the Cypher documentation for full details and query examples.

Comparing models

Two models can be compared to see what was added, removed, or changed:

from sgraph.compare.modelcompare import ModelCompare

mc = ModelCompare()
compare_model = mc.compare('old_model.xml', 'new_model.xml')  # returns an SGraph
mc.printCompareInfos(compare_model)

A CLI is also available (exit codes follow git diff: 0 = no differences, 1 = differences, 2 = error):

python -m sgraph.cli.compare old_model.xml new_model.xml            # human-readable summary
python -m sgraph.cli.compare old_model.xml new_model.xml -f json    # machine-readable JSON
python -m sgraph.cli.compare old_model.xml new_model.xml --rename-detection

See the API reference for the full comparison API.

Current utilization

Softagram uses it for building up the information model about the analyzed software.

Metadata

Release files for sgraph 1.16.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sgraph 1.16.0
File Size Uploaded
sgraph-1.16.0.tar.gz 155.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sgraph 1.16.0
File Interpreter ABI Platform
sgraph-1.16.0-py3-none-any.whl Python 3 none any Details

Total release size: 319.5 kB

Release files / sgraph-1.16.0.tar.gz

Download URL sgraph-1.16.0.tar.gz
Size 155.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b49639784d2d97b5b8c7106ca0a505db50dbf777cd8850c0dead8776d7e74216
BLAKE2b-256 checksum
How to use checksums
183a64a2dcc022e2e851f2506d18f15c288400b6cf23257d44cf5022b7950b8c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.7

Release files / sgraph-1.16.0-py3-none-any.whl

Download URL sgraph-1.16.0-py3-none-any.whl
Size 164.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7bc67f8127ed7e7af095d42290f4fa48929f0a2bfe1d275be9dc87c1ab52dbb1
BLAKE2b-256 checksum
How to use checksums
2e5869384a1bce3572a6dc787c40cf0b04badff011fe4e8003f759327bad7ca3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.7

Release history Release notifications | RSS feed

1.20.0

2 release files

1.19.0

2 release files

1.18.0

2 release files

1.17.0

2 release files

This release

1.16.0 This release

2 release files

1.15.0

2 release files

1.14.0

2 release files

1.13.0

2 release files

1.12.0

2 release files

1.11.0

2 release files

1.10.0

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.2.6

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

3 release files

0.1.1

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page