Recent Releases of Raphtory

Raphtory - v0.16.1

Release v0.16.1

Bug fixes

  • CLI was not correctly exposed in the public wheel, has now been fixed.
  • Locking issue fixed when writing to a node whilst querying a view over it.

What's Changed

  • Registering GraphQL plugins no longer requires the creation of a server — this is now a static function. This brings it in line with what is going on internally as all functions are globally registered.
  • Added a version check on the GraphQL server.

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] 4 months ago

Raphtory - v0.16.0

Replace constant properties with metadata

Constant properties have be completely seperated from temporal properties and are now known as metadata. This means that x.properties.constant should be replaced with x.metadata as in the sample below.

This was done for two reasons:

  • Firstly, the fallback search where x.properties.get("...") would first check temporal properties and then constant was both confusing and caused very unexpected behaviour in the filters.
  • Secondly, they are quite different concepts and upon reflection we felt that completely seperating them in the API would make it clearer that there isn't any overlap.

To fully drive this seperation home you can now have metadata and properties have different types with the same key

python g = PersistentGraph() node = g.add_node(timestamp=1,id=1,properties={"weight":1}) node.add_metadata(metadata = {"weight":"string weight"}) print(node.metadata.get("weight")) print(node.properties.get("weight"))

Time semantics overhaul

  • Seperated explicit node updates from connected edge updates - allowing better filtering.
  • Filtering layers/edges now filters nodes if all the edge updates that added them are filtered out - i.e. the node is not added explicitly via add_node.
    • as a result, subgraph filters nodes that don't have edges in the subgraph and were not explicitly added via add_node.
  • Changed latest_time semantics for the PersistentGraph to return the time of the last update for the node/edge/graph in the current view or the start of the window if there are no updates (previously + Infinity).
  • The earliest_time and latest_time within a filtered Event Graph will now reflect the updates within the graph view instead of just window bounds.
  • Added a Graph.valid() filter that only keeps edges that are currently valid without removing their history
  • isvalid and isactive are no longer the same for the persistent graph
    • active means there is an update during the period (addition or deletion)
    • valid means that the edges most recent update is an addition (persistent semantics).
    • deleted means that the edges most recent update is a deletion.
  • the event graph preserves deletions if created from a persistent graph
    • an edge is included in a window if it is active in the window (has an addition or deletion event)
    • an edge is valid if it has an addition event in the current view
    • an edge is deleted if it has an addition event in the current view
  • The default layer only exists if it has updates on it.
  • Filtering an edge update on a persistent graph turns it into a deletion to keep the semantics sensible

New APIs

  • Edge filtering and exploded edge filtering is now available on the PersistentGraph
  • Enabled filter negation within the property filter APIs
  • filter_exploded_edges now take FilterExpr as input in python (the old Prop("name") api is gone, use filter.Property("name") instead)
  • Added node filters to PathFromNode and PathFromGraph
  • Added edge_history_count() to the nodes API

Graphql server

  • DRASTICALLY improved the performance of the server - over 100 times faster within internal benchmarks
  • Enabled compression by default.
  • Changes the python client to only have one internal client client instead of creating one for each query. (100x faster querying from python)
  • Added rolling and expanding to Graph, Node, Nodes, PathFromNode, Edge and Edges
  • Renamed all graphql structs that started with GQL to make the user facing schema a bit cleaner
  • Change all page endpoints to have two separate arguments for item-based and page-based offsets. The existing offset argument is changed to be item-based, and a separate page_index argument is added for the old page-based behavior. Both can also be used simultaneously.
  • New API for fetching both namespaces and graphs at the same time. (The new object is called a "NamespacedItem")
  • Added apply_views to PathFromNode
  • You can now generate the graphql schema in raphtory via raphtory-graphql schema > schema.graphql removing the need to run a server.
  • You can now insert a custom UI into your custom raphtory builds via a environment variable.
  • Exposed the graphql schema in python - can now be printed via raphtory.graphql.schema() ### Graphql Bug fixes
  • Fixes all graphql signed integer fields not accepting negative numbers.
  • Fixed a problem with namespaces returning null paths and not returning root
  • Fixed issue with recursive writing of indexes causing the server to crash
  • Added validation to edge/node filters to ensure the property type matches the given value
  • Changed caching policy to never kick out graphs after some timeout by default
  • Changed WindowSet to not allow zero size step
  • Fixed issue in rolling where if the step was bigger than the window size the final window would be empty.

Raphtory CLI

  • Adding a raphtory cli which is installed via python where you can start the server or print the schema.
    • image
    • image

UI

Temporal View

  • The scrolling has been drastically improved so that it is no longer super fiddly hovering over the bar.
  • We have added the ability to pin nodes in the temporal view to keep them at the top.
  • Nodes now are highlighted in the temporal view when selected in the graph. The old behaviour of filtering only to edges between highlighted nodes is togglable within the bottom right of the temporal view.
  • The bucketing of edges is now fixed.

Graph view

  • Fixed weird visual artifacts when swapping between highlighting.
  • Highlighting relationship types now actually highlights the edges.
  • Fixed the sorting of activity log and direct connections in the right hand side panel.

Search page

  • Added relationship searching
  • Added namespace searching.
  • Made it clearer that the timeline filtering was optional.
  • Fixed the filters so that greater than, less than, etc work.
  • String searching now can do partial matching

Saved graphs page

  • Minor bug fixes and UX improvements

GraphRag

  • Swapped our default embedded vector store from a homebrewed solution to Arroy
  • Add an argument to the vectorise function so that the user can set a path for storing there the vector cache.
  • Added support for missing apis on the template: access to constantproperties and temporalproperties

Property Indexes Alpha

  • Indexes in Raphtory are now updatable and produce the same answer as the filter APIs. They can be saved to disk alongside the proto file and loaded back into memory via rust, python or a graphql server.
  • Indexes are turned off by default, but can be enabled for for the whole graph, or individual properties via Graph.create_index()

Python

  • Removed unneeded python dependencies and make those that are not needed for core functions optional
  • Relaxed the numpy version to 1.26

General Bug fixes

  • Fixed filter_edges for layers after adding a constant property.
  • Fixed a bug in the interaction between windowing and exploded edge filtering.
  • Fixed parquet reader where Utf8View columns were being converted to LargeUtf8 which was causing problems further downt the pipeline.
  • Fixed some issues with decoding updates from proto between different versions of raphtory.

What's Changed

  • Added NodeStateStringF64 by @david-mrn in https://github.com/Pometry/Raphtory/pull/2034
  • Temporal View Fixes in UI by @rachchan in https://github.com/Pometry/Raphtory/pull/2033
  • Fix/python tests by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2092
  • add utf8view support for proptype conversion from arrow datatype by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/2094
  • Replace existing filters by @shivamka1 in https://github.com/Pometry/Raphtory/pull/1991
  • fix the benchmark permissions so they can be submitted to github pages by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2097
  • fix the lock file by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2096
  • Tests/disk graph by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2099
  • Graphql refactor + rolling/expanding by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2090
  • arroy for vectors by @ricopinazo in https://github.com/Pometry/Raphtory/pull/2074
  • impl index spec by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2103
  • Time semantics overhaul by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1969
  • impl gql path filter, add tests by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2117
  • impl gql index_spec by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2116
  • Bump requests from 2.32.3 to 2.32.4 in /docs in the pip group across 1 directory by @dependabot[bot] in https://github.com/Pometry/Raphtory/pull/2122
  • fix for metadata disk graphs by @rachchan in https://github.com/Pometry/Raphtory/pull/2114
  • fixes filteredges for layers is broken after addconstant_properties by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2123
  • Features/gql filters by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2126
  • Get number of edge updates for a node by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2125
  • Rayon executor for GraphQL by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2128
  • Enable edge filtering on PersistentGraph by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2137
  • Expose valid edge filter in python and graphql by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2149
  • update ui by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2150
  • impl copy on write graph index by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2133
  • Apply views enums and tests by @rachchan in https://github.com/Pometry/Raphtory/pull/2147
  • Fix test failure due to missing extension-module feature by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2154
  • Features/py gql create index by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2151
  • add index bench by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2153
  • update rust version in Dockerfile by @ricopinazo in https://github.com/Pometry/Raphtory/pull/2160
  • Feature/pathfromnode by @rachchan in https://github.com/Pometry/Raphtory/pull/2161
  • Fix indexes are creating too many temporal files on the server by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2158
  • Change page API to have item and page based offsets by @louisch in https://github.com/Pometry/Raphtory/pull/2115
  • Add namespaced item by @louisch in https://github.com/Pometry/Raphtory/pull/2127
  • fix range on TimeIndexWindow by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2166
  • Fix index update by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2167
  • Fix exploded edge filter on persistent graph by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2165
  • enable compression by @ricopinazo in https://github.com/Pometry/Raphtory/pull/2171
  • update ui pin fix by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2173
  • Change compression to fastest by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2176
  • New docs by @jbaross-pometry in https://github.com/Pometry/Raphtory/pull/2175
  • update ui final 0.16 by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2177
  • Weakly connected components implementation with less-pathological worst-case behaviour by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2172
  • Adding some tests for valid graph by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2179
  • fix homepage links by @jbaross-pometry in https://github.com/Pometry/Raphtory/pull/2185
  • Docs-CI-fix by @jbaross-pometry in https://github.com/Pometry/Raphtory/pull/2180
  • add cache argument to vectorise in python and missing template apis by @ricopinazo in https://github.com/Pometry/Raphtory/pull/2182
  • bring explodededgefilter input inline with other filters in python by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2184
  • Fix Raphtory python client by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2190
  • Init UI docs by @jbaross-pometry in https://github.com/Pometry/Raphtory/pull/2188
  • add raphtory cli by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2192
  • fix tests by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2193
  • Expose K-Core to Python API by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/2189
  • Rename constant properties to metadata and remove them from properties by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2194
  • Fixed metadata 2 by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2199
  • James/constprop-to-metadata by @jbaross-pometry in https://github.com/Pometry/Raphtory/pull/2200
  • Fix tests and final 16 changes by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2202
  • James/graphql-docs-only by @jbaross-pometry in https://github.com/Pometry/Raphtory/pull/2204
  • Fix/metadata by @shivamka1 in https://github.com/Pometry/Raphtory/pull/2203
  • Release v0.16.0 by @github-actions[bot] in https://github.com/Pometry/Raphtory/pull/2174

New Contributors

  • @david-mrn made their first contribution in https://github.com/Pometry/Raphtory/pull/2034

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.15.1...v0.16.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] 5 months ago

Raphtory - v0.15.1

What's Changed

  • enable setting up custom ui through env variable by @ricopinazo in https://github.com/Pometry/Raphtory/pull/2000
  • Fix reading of Utf8View columns in parquet reader by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2003
  • Output nodes and edges in similarity search by @rachchan in https://github.com/Pometry/Raphtory/pull/1975
  • Fix/utf8view by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2005
  • Update python dependencies and testing by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2021
  • add as_ref to NodeView by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/2024
  • add option to output graphql schema by @ricopinazo in https://github.com/Pometry/Raphtory/pull/2023
  • update-ui-db132d339 by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2029
  • Fix security and deps by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2025
  • Use fixed dynamic_graphql and up rust version to 1.86 by @louisch in https://github.com/Pometry/Raphtory/pull/2020
  • add patchelf for docs by @miratepuffin in https://github.com/Pometry/Raphtory/pull/2032
  • Release v0.15.1 by @github-actions in https://github.com/Pometry/Raphtory/pull/2031

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.15.0...v0.15.1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] 8 months ago

Raphtory - v0.15.0

API and Model changes

Property changes for Graph to Parquet

As part of our work to unify the in-memory and on-disk storage models of Raphtory and allow us to save directly to formats such as arrow and parquet we have had to make several changes to the model. These include:

  • Restricting Map properties such that for each instance of the map in a history, each key has the same property type.
  • Restrict List properties such that the values must be the same type.
  • Removing Graphs and PersistentGraph properties.

Through this you can now save to/load from parquet via to_parquet and from_parquet. Once we have improved this slightly and added the ability to stream updates in, we will be deprecating the proto format for saving and moving fully to parquet. This is because loading from proto is using a huge amount of memory and is quite slow.

If any of these changes affect your use case, please reach out and we can assist.

Algorithm Result replaced with NodeState

One of the major roadmap objectives for Raphtory is to standardise all outputs as either a NodeState or EdgeState. These dataframe like structures make post-processing significantly easier and as more functionality is added will allow more complicated pipelines to be optimised automatically by Raphtory, instead of an having to swap over to writing a function in rust.

As part of this release we have replaced all instances of AlgorithmResult with NodeState an example of which can be seen below with Pagerank. image These NodeState objects are indexable and have all of the same functionality perviously available in the AlgorithmResult. image The only notable change is Group_by has been renamed to groups as there is only one value to group on. This returns a NodeGroups which is also indexable: image

Fixing Persistent Graph semantics

  • Changed the semantics for edge deletions without a corresponding addition so that they are only considered as an instantaneous event (the edge does not exist before or after)
  • Fixed bug where property values for exploded edges were incorrect for the PersistentGraph
  • Cleaned up semantics for earliest and latest time on edges accordingly
  • Multiple updates at the start of the window are now handled properly
  • No more spurious exploded edges if there is an update at the start of the window

Smaller changes/fixes

  • Fixed an issue where contains and keys were giving inconsistent results for edge properties, leading to a panic python g = Graph() g.add_edge(0, 1, 2, layer="a") g.add_edge(0, 1, 2) g.edge(1, 2).add_constant_properties({"test": 1}) constant_exploded = g.layer("a").edges.explode().properties.constant.values() # used to panic here!
  • Unified the logic between update_constant_properties and add_constant_properties on edges to make sure that the edge actually exists in the layer that the constant properties are being added to.
  • Alongside this unification, if an edge has no temporal updates for one of its layers within a given window, it will now be correctly filtered out of the view - this was previously not happening if that layer had constant properties.
  • Fixed a bug where adding empty temporal updates to graph properties incorrectly affected the earliest/latest time
  • Removed the getbyid function on Properties - this was nonsense and is now only available on temporal and constant properties individually.
  • rolling and expanding can now accept Interval directly instead of complaining about incompatible Error types in the conversion
  • Fixed a bug where the const properties for edges did not align with the values.
  • Materialising and empty graph view now preserves the layer information.
  • Fixes bug where loading from DataFrame would miss adding edges to the layer adjacency lists

Graphql

Apply views

It can be quite annoying to parse the response from a Raphtory server when you have a use case where nested views are changed arbitrarily, altering the depth of results. As such we have added a new function applyViews which allows you to batch in a singular call. This function is available on the Graph, GQLNodes, GQLEdges, Edge and Node.

An example of this can be seen below where we apply excludeNodes, before, layers and edgeFilter and then get the properties of exploded edges - in the first screenshot (how you would currently do this) the edges appear 6 objects deep, which would change if we removed one of these filters. In the second screenshot the edges are 3 objects deep and this won't change if we add or remove filters. The results will otherwise be the same. image

image

Sorting in Graphql

Unlike in python or rust where it is easy to sort the edge/node iterators on anything you like, in graphql this was not possible. This meant a lot more client side processing and made it impossible to page results if you want them sorted by say earliest time.

As such we have added a sorting functionality to GqlNodes and GqlEdges which allow you to order by time, property value and id (or a prioritised combination of these) before paging/listing. An example of this can be seen below where we are sorting nodes first by a property and then by the latest time. image

Namespaces and Graph metadata

We have added a new namespace API in graphql which allows you to easily explore the graphs which are present within each path, and explode the childen and parent of each namespace. This will replace the GQLgraphs api which will be deprecated. image

Calling the graph function within a namespace will return a new MetaGraph object which allows you to query information about that graph without loading it - notably the node/edge count, when it was created, and when it was last edited/accessed.

This information is being stored inside the .raph file which will be automatically updated for any graphs you have saved from <0.15.0.

Read write permissions via JWT

We have added a JWT bearer auth layer on top of Raphtory. It does it by using an EdDSA public key, which makes the server responsibility boil down to only two things:

  • Correctly validating JWTs.
  • Allowing access only to those resources stated in the JWT.

The responsibility for preventing a secret leakage is out of the equation since Raphtory doesn't have access to the private key, responsible for encoding JWTs.

Currently we are using this to specify if users can read (accessing all graphs) or write (able to modify all graphs). However, in future versions this will be used to limit users to specific namespaces and possibly information within each graph.

Other changes

  • Changed anywhere that was returning a list of Nodes or list of Edges to GQLNodes and GQLEdges respectively. This is so all output can be correctly paged. If you notice anywhere that is not the case, please do raise an issue.
  • The in- and out-components were not applying the one-hop filter resetting correctly - the GQLNodes which are returned will now return back to the graph filter and can be layered/windowed differently than the node which in/out-components was called on.
  • Addded an option ids argument to nodes query in GraphQL for getting a subset of the nodes without having to reduce the graph via subgraph.
  • Added a new mutation create_subgraph which we use to allow saving of graph views in the open source UI.
  • Removed the ability to create RemoteEdge and RemoteNode directly in python, this should now only be able to be grabbed from a RemoteGraph
  • Fix a bug causing NaN float to panic when querying through GraphQL
  • Change the schema queries so it doesn't eagerly iterate over all nodes in the graph - if the variants for a property are >100, this will return an empty list to reduce computation.

Algorithms

  • The docstrings, method signatures, and return types of many of the algorithms have been standardised as part of the swap to Nodestate from AlgorithmResult
  • Fix the order in which nodes are considered in the in- and out-component algorithm so the calculated distances are correct.
  • Added integer support to balance algorithm - Previously, edge properties had to be converted to floats. Now ints and floats both work as expected.
  • 'clusteringcoefficient' is renamed to 'globalclusteringcoefficient'. All of the clustering coefficient variants have been moved to a submodule of 'metrics' called 'clusteringcoefficient'. It was previously extremely inefficient to run LCC on a group of nodes.
  • The new batch version should do a better job of parallelizing the process and reducing overhead.
  • Remove inefficient early-culling code from SCC implementation
    • The SCC implementation featured a block of code in the beginning which exhaustively checked which nodes belong to a strongly connected component by performing a BFS search and checking if the source node is reachable from itself. In the way this is implemented, this is entirely redundant to the process of just executing Tarjan's SCC algorithm, which it already subsequently executes.

Documentation

  • We have added a huge amount of documentation to python and graphql alongside improvements to the stub generator to let us know what is missing. There are currently screaming warning everywhere as there is still a lot to add, but should make it much easier to manage this moving forward.
  • We have turned the stub generator into a python package that can be installed for use with other projects - This will probably be released to pypi soon.

Vector APIs

  • Added default document templates as having default templates is a first step towards a smart search view on the open source UI.
  • Update vector API (on the server as well) to allow choosing between using the default template, a custom one, or nothing at all, for each of the three types of entities
  • Fixed a bug causing subgraphs to allow containing the same node more than once
  • Reviewed public API to stick to temporalprops / constantprops naming convention

Optimisations and misc

  • Started work on several known issues when iterating over edges - still much to do, but should be noticeably faster now.
  • Calling edges on a subgraph should no longer iterate over all edges in the entire graph to apply the subgraph filter.
  • Now Using DoubleEndedIterator for last value in node temporal properties.
  • Fix the optimisation that checks if the window is actually a constraint to look at the underlying storage, not the wrapped view (which is both potentially slow and incorrect). This increases performance notably for nested windows.
  • Fixed GIL deadlock when setting up a custom embedding function in python - this was making it impossible to use custom Python functions.
  • Fix three node motif images being missing from wheel when published to pypi.
  • Make edge property pub in PyEdge so that we can use the PyEdge as inputs outside of the crate
  • Added working APIs for node type loading for diskgraph
  • Disk graph can now load node ids from the node properties instead of sorting the edge list (this is faster and allows for nodes that do not have edges)

What's Changed

  • Restrict maturin version to solve metadata problem in release by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1883
  • Fix the private storage when loading single layer graphs by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1885
  • add support for loading node ids from node property parquet by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1886
  • fixes #1884 by @shivamka1 in https://github.com/Pometry/Raphtory/pull/1887
  • Update dependencies by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1891
  • rename examples to rust-examples to fix dependabot by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1888
  • create python NodeState from Arc by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1890
  • Document template fixes by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1894
  • remove early-culling code from SCC by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1895
  • Make stub generator installable by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1900
  • Fix in- and out-component distance calculations by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1904
  • Bump the pip group across 1 directory with 2 updates by @dependabot in https://github.com/Pometry/Raphtory/pull/1871
  • Bump jinja2 from 3.1.4 to 3.1.5 in /docs in the pip group across 1 directory by @dependabot in https://github.com/Pometry/Raphtory/pull/1905
  • add integer support to balance algorithm; apply formatting by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1898
  • Refactor Node Temporal properties by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1897
  • Change explode and explode layers to return GQL edges by @rachchan in https://github.com/Pometry/Raphtory/pull/1910
  • GqlEdges sorting by @louisch in https://github.com/Pometry/Raphtory/pull/1906
  • Add group_by support for NodeState by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1903
  • Feature/gql sort nodes by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1912
  • remove Graph and PersistentGraph from Prop by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1902
  • Clean up python documentation by fixing the warnings from the stub parser by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1917
  • edges const prop iter do not aligh keys with values by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1920
  • Algorithm standardisation by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1896
  • Update GraphQl client documentation by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1921
  • Exclude HTML files from GitHub stats by @Alnaimi- in https://github.com/Pometry/Raphtory/pull/1928
  • fix slow windowed views for disk storage by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1931
  • fix motif images missing from wheel by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1925
  • fix GIL deadlock when setting up a custom embedding function in python by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1929
  • add create_subgraph function to graphql by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1924
  • replace AlgorithmResult with NodeState in rust by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1930
  • fix protobuf errors by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1933
  • no manual variant management for proto enums by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1934
  • contains and keys were giving inconsistent results by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1935
  • clustering coefficient update by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1909
  • Graph to parquet by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1932
  • Fix quirks in rolling and expanding APIs by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1940
  • No constant edge properties on layers without updates by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1939
  • update polars to 0.40.0 by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1942
  • Minor fixes for GraphQL server by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1945
  • Fix and update time semantics for PersistentGraph by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1946
  • No get_by_id on Properties by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1952
  • implement IntoPyObject for node state of integer tuples by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1953
  • Apply multiple views in one graphql function by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1951
  • Fix performance for nested window views by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1955
  • expose node type loading for disk storage by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1956
  • Expose node type loading by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1957
  • Get subset of nodes from GraphQL by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1958
  • fix in- and out-components hop filter resetting by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1959
  • Gql constant time schema by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1954
  • Optimise1 by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1962
  • fix python release workflow by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1961
  • update ui by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1963
  • Fix node and edge filters by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1964
  • add test for complex props by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1911
  • Update README.md by @Alnaimi- in https://github.com/Pometry/Raphtory/pull/1966
  • Use DoubleEndedIterator for last value in node temporal properties by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1970
  • try to optimise edges for subgraph by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1972
  • fix the missaligned offsets on disk graph add tests by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1974
  • make sure not to scramble the output values for subgraphs that have a non-standard node order by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1973
  • Impl index based filtering for Raphtory APIs alongside Search APIs by @shivamka1 in https://github.com/Pometry/Raphtory/pull/1899
  • PyEdge access to attribute edge by @BaCk7 in https://github.com/Pometry/Raphtory/pull/1980
  • Decimal support by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1943
  • Add namespace search to graphql by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1968
  • Basic creation/updating of metadata in .raph for MetaGraph by @louisch in https://github.com/Pometry/Raphtory/pull/1976
  • Make rust filter builder apis consistent with python by @shivamka1 in https://github.com/Pometry/Raphtory/pull/1979
  • add jwt bearer auth by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1989
  • fix dataframe loader bug by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1992
  • ui bundle by @rachchan in https://github.com/Pometry/Raphtory/pull/1994
  • new bundle by @rachchan in https://github.com/Pometry/Raphtory/pull/1996
  • Improve tests for parquet ingestion/materialize by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1995
  • Readme changes and final docs for 0.15 by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1997
  • Release v0.15.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1998

New Contributors

  • @BaCk7 made their first contribution in https://github.com/Pometry/Raphtory/pull/1980

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.14.0...v0.15.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] 9 months ago

Raphtory - 0.15-beta

API and Model changes

Property changes for Graph to Parquet

As part of our work to unify the in-memory and on-disk storage models of Raphtory and allow us to save directly to formats such as arrow and parquet we have had to make several changes to the model. These include:

  • Restricting Map properties such that for each instance of the map in a history, each key has the same property type.
  • Restrict List properties such that the values must be the same type.
  • Removing Graphs and PersistentGraph properties.

Through this you can now save to/load from parquet via to_parquet and from_parquet. Once we have improved this slightly and added the ability to stream updates in, we will be deprecating the proto format for saving and moving fully to parquet. This is because loading from proto is using a huge amount of memory and is quite slow.

If any of these changes affect your use case, please reach out and we can assist.

Algorithm Result replaced with NodeState

One of the major roadmap objectives for Raphtory is to standardise all outputs as either a NodeState or EdgeState. These dataframe like structures make post-processing significantly easier and as more functionality is added will allow more complicated pipelines to be optimised automatically by Raphtory, instead of an having to swap over to writing a function in rust.

As part of this release we have replaced all instances of AlgorithmResult with NodeState an example of which can be seen below with Pagerank. image These NodeState objects are indexable and have all of the same functionality perviously available in the AlgorithmResult. image The only notable change is Group_by has been renamed to groups as there is only one value to group on. This returns a NodeGroups which is also indexable: image

Fixing Persistent Graph semantics

  • Changed the semantics for edge deletions without a corresponding addition so that they are only considered as an instantaneous event (the edge does not exist before or after)
  • Fixed bug where property values for exploded edges were incorrect for the PersistentGraph
  • Cleaned up semantics for earliest and latest time on edges accordingly
  • Multiple updates at the start of the window are now handled properly
  • No more spurious exploded edges if there is an update at the start of the window

Smaller changes/fixes

  • Fixed an issue where contains and keys were giving inconsistent results for edge properties, leading to a panic python g = Graph() g.add_edge(0, 1, 2, layer="a") g.add_edge(0, 1, 2) g.edge(1, 2).add_constant_properties({"test": 1}) constant_exploded = g.layer("a").edges.explode().properties.constant.values() # used to panic here!
  • Unified the logic between update_constant_properties and add_constant_properties on edges to make sure that the edge actually exists in the layer that the constant properties are being added to.
  • Alongside this unification, if an edge has no temporal updates for one of its layers within a given window, it will now be correctly filtered out of the view - this was previously not happening if that layer had constant properties.
  • Fixed a bug where adding empty temporal updates to graph properties incorrectly affected the earliest/latest time
  • Removed the getbyid function on Properties - this was nonsense and is now only available on temporal and constant properties individually.
  • rolling and expanding can now accept Interval directly instead of complaining about incompatible Error types in the conversion
  • Fixed a bug where the const properties for edges did not align with the values.
  • Materialising and empty graph view now preserves the layer information.
  • Fixes bug where loading from DataFrame would miss adding edges to the layer adjacency lists

Graphql

Apply views

It can be quite annoying to parse the response from a Raphtory server when you have a use case where nested views are changed arbitrarily, altering the depth of results. As such we have added a new function applyViews which allows you to batch in a singular call. This function is available on the Graph, GQLNodes, GQLEdges, Edge and Node.

An example of this can be seen below where we apply excludeNodes, before, layers and edgeFilter and then get the properties of exploded edges - in the first screenshot (how you would currently do this) the edges appear 6 objects deep, which would change if we removed one of these filters. In the second screenshot the edges are 3 objects deep and this won't change if we add or remove filters. The results will otherwise be the same. image

image

Sorting in Graphql

Unlike in python or rust where it is easy to sort the edge/node iterators on anything you like, in graphql this was not possible. This meant a lot more client side processing and made it impossible to page results if you want them sorted by say earliest time.

As such we have added a sorting functionality to GqlNodes and GqlEdges which allow you to order by time, property value and id (or a prioritised combination of these) before paging/listing. An example of this can be seen below where we are sorting nodes first by a property and then by the latest time. image

Other changes

  • Changed anywhere that was returning a list of Nodes or list of Edges to GQLNodes and GQLEdges respectively. This is so all output can be correctly paged. If you notice anywhere that is not the case, please do raise an issue.
  • The in- and out-components were not applying the one-hop filter resetting correctly - the GQLNodes which are returned will now return back to the graph filter and can be layered/windowed differently than the node which in/out-components was called on.
  • Addded an option ids argument to nodes query in GraphQL for getting a subset of the nodes without having to reduce the graph via subgraph.
  • Added a new mutation create_subgraph which we use to allow saving of graph views in the open source UI.
  • Removed the ability to create RemoteEdge and RemoteNode directly in python, this should now only be able to be grabbed from a RemoteGraph
  • Fix a bug causing NaN float to panic when querying through GraphQL
  • Change the schema queries so it doesn't eagerly iterate over all nodes in the graph - if the variants for a property are >100, this will return an empty list to reduce computation.

Algorithms

  • The docstrings, method signatures, and return types of many of the algorithms have been standardised as part of the swap to Nodestate from AlgorithmResult
  • Fix the order in which nodes are considered in the in- and out-component algorithm so the calculated distances are correct.
  • Added integer support to balance algorithm - Previously, edge properties had to be converted to floats. Now ints and floats both work as expected.
  • 'clusteringcoefficient' is renamed to 'globalclusteringcoefficient'. All of the clustering coefficient variants have been moved to a submodule of 'metrics' called 'clusteringcoefficient'. It was previously extremely inefficient to run LCC on a group of nodes.
  • The new batch version should do a better job of parallelizing the process and reducing overhead.
  • Remove inefficient early-culling code from SCC implementation
    • The SCC implementation featured a block of code in the beginning which exhaustively checked which nodes belong to a strongly connected component by performing a BFS search and checking if the source node is reachable from itself. In the way this is implemented, this is entirely redundant to the process of just executing Tarjan's SCC algorithm, which it already subsequently executes.

Documentation

  • We have added a huge amount of documentation to python and graphql alongside improvements to the stub generator to let us know what is missing. There are currently screaming warning everywhere as there is still a lot to add, but should make it much easier to manage this moving forward.
  • We have turned the stub generator into a python package that can be installed for use with other projects - This will probably be released to pypi soon.

Vector APIs

  • Added default document templates as having default templates is a first step towards a smart search view on the open source UI.
  • Update vector API (on the server as well) to allow choosing between using the default template, a custom one, or nothing at all, for each of the three types of entities
  • Fixed a bug causing subgraphs to allow containing the same node more than once
  • Reviewed public API to stick to temporalprops / constantprops naming convention

Optimisations and misc

  • Started work on several known issues when iterating over edges - still much to do, but should be noticeably faster now.
  • Calling edges on a subgraph should no longer iterate over all edges in the entire graph to apply the subgraph filter.
  • Now Using DoubleEndedIterator for last value in node temporal properties.
  • Fix the optimisation that checks if the window is actually a constraint to look at the underlying storage, not the wrapped view (which is both potentially slow and incorrect). This increases performance notably for nested windows.
  • Fixed GIL deadlock when setting up a custom embedding function in python - this was making it impossible to use custom Python functions.
  • Fix three node motif images being missing from wheel when published to pypi.
  • Make edge property pub in PyEdge so that we can use the PyEdge as inputs outside of the crate
  • Added working APIs for node type loading for diskgraph
  • Disk graph can now load node ids from the node properties instead of sorting the edge list (this is faster and allows for nodes that do not have edges)

What's Changed

  • Restrict maturin version to solve metadata problem in release by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1883
  • Fix the private storage when loading single layer graphs by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1885
  • add support for loading node ids from node property parquet by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1886
  • fixes #1884 by @shivamka1 in https://github.com/Pometry/Raphtory/pull/1887
  • Update dependencies by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1891
  • rename examples to rust-examples to fix dependabot by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1888
  • create python NodeState from Arc by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1890
  • Document template fixes by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1894
  • remove early-culling code from SCC by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1895
  • Make stub generator installable by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1900
  • Fix in- and out-component distance calculations by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1904
  • Bump the pip group across 1 directory with 2 updates by @dependabot in https://github.com/Pometry/Raphtory/pull/1871
  • Bump jinja2 from 3.1.4 to 3.1.5 in /docs in the pip group across 1 directory by @dependabot in https://github.com/Pometry/Raphtory/pull/1905
  • add integer support to balance algorithm; apply formatting by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1898
  • Refactor Node Temporal properties by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1897
  • Change explode and explode layers to return GQL edges by @rachchan in https://github.com/Pometry/Raphtory/pull/1910
  • GqlEdges sorting by @louisch in https://github.com/Pometry/Raphtory/pull/1906
  • Add group_by support for NodeState by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1903
  • Feature/gql sort nodes by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1912
  • remove Graph and PersistentGraph from Prop by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1902
  • Clean up python documentation by fixing the warnings from the stub parser by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1917
  • edges const prop iter do not aligh keys with values by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1920
  • Algorithm standardisation by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1896
  • Update GraphQl client documentation by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1921
  • Exclude HTML files from GitHub stats by @Alnaimi- in https://github.com/Pometry/Raphtory/pull/1928
  • fix slow windowed views for disk storage by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1931
  • fix motif images missing from wheel by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1925
  • fix GIL deadlock when setting up a custom embedding function in python by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1929
  • add create_subgraph function to graphql by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1924
  • replace AlgorithmResult with NodeState in rust by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1930
  • fix protobuf errors by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1933
  • no manual variant management for proto enums by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1934
  • contains and keys were giving inconsistent results by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1935
  • clustering coefficient update by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1909
  • Graph to parquet by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1932
  • Fix quirks in rolling and expanding APIs by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1940
  • No constant edge properties on layers without updates by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1939
  • update polars to 0.40.0 by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1942
  • Minor fixes for GraphQL server by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1945
  • Fix and update time semantics for PersistentGraph by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1946
  • No get_by_id on Properties by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1952
  • implement IntoPyObject for node state of integer tuples by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1953
  • Apply multiple views in one graphql function by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1951
  • Fix performance for nested window views by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1955
  • expose node type loading for disk storage by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1956
  • Expose node type loading by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1957
  • Get subset of nodes from GraphQL by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1958
  • fix in- and out-components hop filter resetting by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1959
  • Gql constant time schema by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1954
  • Optimise1 by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1962

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.14.0...0.15-beta

Scientific Software - Peer-reviewed - Rust
Published by miratepuffin 10 months ago

Raphtory - v0.14.0

Cached View

We have added a new function .cache_view which builds a lightweight index of the nodes and edges present in the current view (i.e. when you have applied a window/layer filter etc). If you are running any global algorithms or analytical pipelines over views, this will make your analysis drastically faster! Example: ``` python g = Graph()

add some updates

for windowedgraph in g.rolling("1 day"): cached = windowedgraph.cacheview() #We are gonna run several algorithms, so build an index rp.weaklyconnected_components(cached) rp.pagerank(cached) ```

Node and edge filter view

We have added new views for the filtering of Nodes and Edges based upon property values. This includes checking: - if a property exists/doesn't exist - if the property value is less than/greater than/equal to a give argument - if the property value is in/not in a list of given arguments.

Note the edge filters are currently disabled for PersistentGraph whilst we confirm there are no missing corner cases.

Python example: ```python from raphtory import Graph g = Graph

add some updates

graph.filteredges(Prop("testint") > 2) graph.filterexplodededges(Prop("teststr") != "first") graph.filternodes(Prop("nodebool").issome()) graph.filternodes(Prop("nodeint") in [2,2,4]) ```

Graphql example: graphql graph(path: "g") { nodes { nodeFilter( property: "prop1", condition: { operator: ANY, value: [10, 30, 50, 70] } ) { list { name } } } }

Create Node

Added a create_node function which works exactly the same as add_node but will fail if the node is already in the graph. This is mostly useful in Graphql, where it is harder to first check if a node exists, but has been exposed in python as well.

Example: python from raphtory import Graph g = Graph() g.create_node(1,1) #Returns fine g.create_node(1,1) #Throws an exception g.add_node(1,1) #Returns fine

Import as

Added a set of import_as functions which allow renaming of nodes and edges when importing from one graph into another. Example: ```python from raphtory import Graph g1 = Graph() a = g1.addnode(1, "A") #create node A in graph1 g2 = Graph() g2.importnode_as(a, "X") # import A into graph2 as X - this brings all updates and properties as well

e = g1.addedge(1,"A","B"") # add edge A->B to graph1 g2.importedge_as(e,("X","Y")) #import edge A->B into graph2 as X->Y - this brings all updates and properties with it ```

Python

  • When using the Property APIs with any numerical properties Raphtory will now return numpy arrays instead of python lists. This is better for memory usage, faster to hand over from rust, and means aggregations etc are a lot more straight forward.
  • Exposed the secondary time index, allowing mangement of updates which occur at the same time.
  • Changes Graph.add_property to Graph.add_properties to bring it in line with other APIs.
  • Fixed a bug in the repr where we were print the wrong edge info (#1808)
  • Added wrappers for constructing vecs from any python iterable, meaning Nodes and Edges can be handed over to import functions directly without collecting.

Algorithms

  • Added FastRP based on "Fast and Accurate Network Embeddings via Very Sparse Random Projection" by Haochen Chen, et al.
  • Added maximum-weighted matching based on "Efficient Algorithms for Finding Maximum Matching in Graphs" by Zvi Galil, et al.
  • Changed the return of in-component and out-component to include the distance from the starting node.

UI updates

  • We have added a Saved graphs page which enables you to open whole graphs and get some top level statistics on each of the graphs on your server. An example of this can be seen below.
  • A whole heap of small bug fixes! We have noted several more (thank you everyone that is reporting them) and shall be blasting through them over the coming weeks before Christmas).

image

GraphQL

  • Added the edge ID function which returns the names of the source and destination as an array.
  • Added explode and eplode_layers onto the edges object.
  • Added all node property filters to graphql - examples of these can be found here.
  • Added the namespace function onto graph/graphql to allow easier grouping by path.
  • Removes the ability to create RemoteGraph directly, can now only be done through the client

Core-Raphtory

  • Made lazy node state support time ops and layer ops. This allows you to e.g. get a windowed degree for all nodes in the graph. This is a step towards out new NodeState APIs which should be complete soon.
  • Exposed several low level APIs to make writing raphtory extensions easier.
  • Subgraphs creation is now faster as we no longer need to build a hashset. Counting nodes should also be much faster now as well.
  • Made the inner rust value accessible on python NodeState and LazyNodeState wrappers.
  • Exposed parquet_loaders in rust.
  • updated our pyo3 version for python bindings to the new APIs.
  • Removed snmalloc as the build started to fail due to some unknown upstream dependency.

Python Documentation

  • Drastically improved the stub generation for hints within python IDEs
  • Fixed many missing types/doc strings, incorrect/confusing descriptions
  • Added warning for missing docs (still some to fix, but will mean in future we can fix a lot quicker)

Datasets

  • Added some properties to the LOTR data for the basic graphRAG example.

What's Changed

  • Py speedup1 by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1840
  • install rustup + cargo when generating readthedocs by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1846
  • Fix existing rust Dockerfile by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1844
  • Adding initial docker files by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1836
  • fix docker by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1849
  • fix docker release by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1851
  • Fix/workflow by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1852
  • Update/pyo3 by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1847
  • Make load edges pub in parquet_loaders.rs by @Alnaimi- in https://github.com/Pometry/Raphtory/pull/1843
  • Node property filters by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1830
  • Feature/graphqlfunctions by @rachchan in https://github.com/Pometry/Raphtory/pull/1853
  • remove snmalloc by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1856
  • max weight matching by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1602
  • Feature/create node by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1855
  • Update pullrequesttemplate.md by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1858
  • add wrapper for constructing vec from any python iterable by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1862
  • Sparse Node temporal props by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1848
  • impl filters and tests by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1857
  • Feature/node state ops by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1854
  • Feature/import as by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1859
  • impl edge id for graphql and add test by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1868
  • add fast_rp algorithm by @wyatt-joyner-pometry in https://github.com/Pometry/Raphtory/pull/1867
  • Fix iconify icons by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1863
  • improve subgraph count_nodes performance by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1869
  • Add UI section to README.md by @Alnaimi- in https://github.com/Pometry/Raphtory/pull/1872
  • fix issue with edge repr multiple layer by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1870
  • no reason to make a Hashset when building a subgraph anymore by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1874
  • update graphql ui by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1876
  • Various improvements for disk graph by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1866
  • Add distance from starting node for in- and out-components by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1877
  • Features/py sec indices by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1875
  • make the inner rust value accessible on python NodeState and LazyNodeState wrappers by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1878
  • add lotrgraphwith_props function by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1881
  • Feature/more public apis by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1879
  • Fix stubs with make tidy before release by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1880
  • Release v0.14.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1865
  • Disable auto docker publish by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1882

New Contributors

  • @wyatt-joyner-pometry made their first contribution in https://github.com/Pometry/Raphtory/pull/1867

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.13.1...v0.14.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 1 year ago

Raphtory - v0.13.1

What's Changed

  • GrapQL improvements for disk graph by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1824
  • Support multiple layers for disk storage by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1817
  • GraphQL optional indexing by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1827
  • Snapshot at/latest by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1832
  • more stub cleanup to reduce the number of type errors in tests by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1834
  • exclude LayeredGraph from EdgeFilterOps by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1828
  • Embed GraphQL playground into Raphtory UI by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1838
  • Release v0.13.1 by @github-actions in https://github.com/Pometry/Raphtory/pull/1841

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.13.0...v0.13.1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 1 year ago

Raphtory - v0.13.0

UI Alpha

  • We have released the first version of the Raphtory UI. This should work for any graph that you host within your GraphServer and is available at / by default. The graphql playground has been moved to /playground.
  • We have many more plans for this UI, but in the meantime if you notice it isn't handling your data correctly, or you find a bug please report and issue and we shall get it fixed.
  • Below is an example of the UI with the Lord of the Rings graph loaded:

Small tweaks

  • The python doc stubs now error when the return type is incorrect - all current errors have been fixed. We will start to enable more warning and tidy these up fully over the coming releases.
  • PyDirection is no more and direction arguments now take strings as input directly (The only way to construct a PyDirection was via passing in a string anyway so this seemed entirely confusing and useless).
  • Added layers to the edge repr to show what layers an edge/exploded edge is present in, e.g.

Bug fixes

  • to_df in AlgorithmResult no longer returns internal ids
  • Graph.edges.explode().to_df() is now equivalent to Graph.edges.to_df(explode=True), in particular the history is no longer duplicated for each exploded edge.
  • The EmbeddingFunction was changed to return a Result to be able to bubble up errors instead of panicking. These changes were propagated all the way up.
  • Path inputs in python now use PathBuf instead of String, removing a host of annoying issues, especially in windows.

What's Changed

  • make EmbeddingFunction return a result instead of panicking by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1806
  • Use PathBuf for python path input by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1813
  • Load const props by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1811
  • expose encode graph by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1812
  • add support to exclude edge temp properties on import by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1814
  • Edge repr layers by @narnolddd in https://github.com/Pometry/Raphtory/pull/1809
  • type annotations in stubs created from docs by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1815
  • GraphQL UI by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1816
  • fix the to_df in AlgorithmResult and Edges by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1820
  • Release v0.13.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1823

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.12.1...v0.13.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 1 year ago

Raphtory - v0.12.1

Release v0.12.1 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 1 year ago

Raphtory - v0.12.0

Obvious breaking changes

In our efforts to better support indexes over properties and vector representations of the graph we have changed the on-disk representation of a Raphtory graph to a folder. Within this folder we can store the graph itself, any vectors, indexes, metadata, etc. required to simplfy the transfer of a graph between your machine and a GraphServer, or between yourself and colleages working on the same data.

As such the function save_to_file() will now produce a folder containing this new structure. If you would like to continue having a singular file (for purposes of transfer or ease) you can instead call save_to_zip(). This zip can be directly be read by Raphtory when you call load_from_file() so don't worry about having to unzip later.

New Vector APIs and integration with the GraphServer

  • We have updated vector query APIs as per #1713. The new vector context makes it much easier to query the nodes/edges/graphs by both similarity and structural elements such as neighbours. We have also tried to make it a lot clearer what each function is bringing into the context.
  • The embedding function is now set globally for the GraphServer and the conversion between graph/nodes/edges -> Document is now specified via jinja templates. This is to make it possible to store a vectorised Graph on disk.
  • Vectors are now updated when a node/edge are updated.

Algorithms

  • Incomponents and outcomponents have been optimised to do the minimal number of checks before returning a result.
  • Incomponent and outcomponent have been added for when you only want to get the component for an individual node.

Graphql

  • Incomponent and outcomponent have been made available on Node within Graphql - this returns a vec of Node objects allowing you to get metadata/properties of the nodes within this component.
  • A generated Schema is now available via Graphql to see what the type of all properties are for both nodes and edges.
  • We have drastically simplified the plugin APIs for the GraphServer, and now allow both custom mutations and queries. An example of this can be seen here: https://github.com/Pometry/Raphtory/tree/master/examples/custom-gql-apis.
  • Added open telemetry tracing to the GraphServer, allowing you to track the speed of all raphtory queries.
  • Added better logging throughout the GraphServer.

Edge filtering Alpha

  • We have released an alpha of edge property filtering - this allows you to filter both whole edges or updates within edges (exploded edges) in a variety of useful ways (see below).
  • This is currently limited to the EventGraph whilst we fix some semantics for the PersistentGraph. Please let us know if you notice anything odd, or unexpected with these if you give them a go. image

Latest and is_active

  • We have added a latest() function onto the graph, node and edge. This is the equivalent of doing x.at(graph.latesttime). This isn't a massive issue in rust/python, but is very helpful in graphql, where you would have to do an initial query to get the latesttime.
  • We have exposed an is_active() function to nodes and edges, allowing you to check if they have any updates within the current window. This is very useful if you are calling rolling or expanding on a node/edge.

Bug fixes and performance improvements

  • Floats are now supported timestamps within python.
  • Fixed an issue in the motif algorithms where self loops were not being correctly handled.
  • Parallelised reading from saved graphs and for generation of new graphs with materialise.
  • Fixed the constant properties function in graphql as it was not set to async.
  • Fixed several 'off-by-one' errors in the boundary checks for node/edge window inclusion within the PersistentGraph.
  • Added the eventgraph function to Graph and persistentgraph function to PersistentGraph - these are basically just NoOps, but make it so in python you can call them without knowing what type of graph you currently have.

Commits

  • New vector API by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1717
  • Bool properties and test_graphdb changes by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1767
  • Fix node types returned from graphql being empty by @louisch in https://github.com/Pometry/Raphtory/pull/1775
  • Motif self loops by @narnolddd in https://github.com/Pometry/Raphtory/pull/1777
  • fix/gql add new apis by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1750
  • Feature/materialise improvement by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1773
  • Graphql logging by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1746
  • Implement edge property filtering by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1781
  • Persistent Graph boundry fix by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1785
  • Feature/latest and active by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1786
  • impl create update graph gql apis as plugins by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1784
  • fix issues with casting time columns by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1793
  • More edge property filters by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1783
  • GraphQL vector updates by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1778
  • add float timestamp support in python by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1794
  • impl schema node edge prop type by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1789
  • Updating request due to issue in quinn-proto (CVE-2024-45311) by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1797
  • Incomponent outcomponent by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1790
  • Release v0.12.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1798

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.11.3...v0.12.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 1 year ago

Raphtory - v0.11.3

Parallel python loaders

Through some elegant dancing around locks, the pandas and parquet loaders now ingest into Raphtory’s underlying graph shards with minimal contention between threads. This has led to an order of magnitude improvement in ingestion speed in several of our use cases!

An example of this can be seen below where the 129 million edges of the Graph500 SF23 dataset are ingested in 25 seconds on a laptop!

image

Other minor bug fixes

  • Don't drop the update in the Cache if the write fails by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1745
  • fix typo in cdf and ccdf functions by @narnolddd in https://github.com/Pometry/Raphtory/pull/1748
  • More cache writer error handling improvements by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1747
  • fix latest_time for exploded edge on PersistentGraph for edges that are deleted at the same time as created by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1752
  • implementation of temporal rich club by @narnolddd in https://github.com/Pometry/Raphtory/pull/1692
  • Write-locked graph storage implementation for faster bulk loaders by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1741
  • Release v0.11.3 by @github-actions in https://github.com/Pometry/Raphtory/pull/1753

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.11.2...v0.11.3

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.11.2

Release v0.11.2 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.11.1

Release 0.11.1

Bug Fixes

  • Exposed delete on edge in python
  • Fixed missing DTime parsing on Python properties
  • Fixed a bug in importnode(s)/importedge(s) when the graph is indexed with ints

Graphql

  • Added new RemoteGraph, RemoteNode and RemoteEdge classes to wrap updates to graph on a server. These functions can be seen below
  • Made Properties optional in add_updates for Node and Edge in Graphql
  • fixed a bug in batch add nodes, where you couldn't just add the node_type.

```python client = graphql.RaphtoryClient(url="http://localhost:1736")

RaphtoryClient functions

client.new_graph(path)

RemoteGraph Functions

client.graph(path).addnode() client.graph(path).addnodes() client.graph(path).addedge() client.graph(path).addedges() client.graph(path).deleteedge() client.graph(path).addproperties() client.graph(path).addconstantproperties() client.graph(path).updateconstantproperties()

RemoteNode functions

client.graph(path).node(name).addconstantproperties() client.graph(path).node(name).setnodetype() client.graph(path).node(name).updateconstantproperties() client.graph(path).node(name).add_updates()

RemoteEdge functions

client.graph(path).edge(src,dst).delete() client.graph(path).edge(src,dst).addconstantproperties() client.graph(path).edge(src,dst).updateconstantproperties() client.graph(path).edge(src,dst).add_updates() ```

Misc

  • Tided up graphql pytests as having a single file was driving me mad
  • Broke the graphql python module into smaller files

What's Changed

  • Upgrade Datafusion to 52 and fix the schema errors by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1716
  • Graphql helper by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1733
  • Release v0.11.1 by @github-actions in https://github.com/Pometry/Raphtory/pull/1739

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.11.0...v0.11.1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.11.0

Release v0.11.0

Cached Graph

  • We have updated the on-disk format of the graph to now be stable across versions.
  • This new storage format is also updatable, allowing deltas to be inserted into an already existing file instead of having to resave the whole graph.
  • You can now 'cache' a graph, attaching a file to it, and periodically save all changes which have been inserted. Great for checkpointing! See the example below:

```python from raphtory import Graph g= Graph() #Create new graph

g.addedge(1,1,2) g.addedge(3,4,5) g.cache("example_graph.raph") #add some updates and write these to a file - keeping the file attached to the graph

g.addnode(2,3) g.addedge(10,2,3) g.write_updates() #Add some new updates and write these out ```

GraphQL

  • The GraphQL server has had a massive overhaul, allowing it to now create, update, and manage a working directory full of graphs.
  • Graphs will now persist across server runs based on the new cache-graph file format described above.
  • These new APIs also allow you to export subgraphs from one graph into another.

A basic example of this can be seen below:

```python from raphtory import graphql

server = graphql.GraphServer("graphs/") server.run() client = server.get_client() #run a local server and get the client

create a new graph in the 'example_graphs' namespace

client.query(""" mutation { newGraph(path:"example_graphs/graph1",graphType:EVENT) } """)

add an edge into the new graph

client.query(""" query addedge{ updateGraph(path: "examplegraphs/graph1") { addEdge(time:1,src:"node1",dst:"node2",properties: [ {key: "new", value: "new props are awesome"} {key: "number", value: 0.7} {key: "map", value: { a: "hi"}} ]){success} } }""")

```

Pandas and Parquet loader changes:

  • We have placed time as the second parameter within the graph.load_x_from_y to match g.add_node and g.add_edge.
  • All parameters named props in the graph.load_x_from_y functions have been updated to properties.
  • The Layer_in_df flag has been replaced by layer and layer_col which will now throw an error if both are set.
  • The node_type_in_df flag has been replaced by node_type and node_type_col which will now throw an error if both are set.
  • You can now set the nodetype via `loadnodepropsfrom_x` functions.
  • We have removed the static load_from_pandas and load_from_parquet functions from the graph as these had WAY too many arguments and were all around very confusing. Instead you can now create a graph first and use load_edges_from_X etc.
  • The Datareader behind the Pandas and Parquet loaders now chunks the data and loads these in in part, drastically reducing the memory overhead for large datasets on ingestion.

Minor changes

  • Optimised the way node IDs are stored/referenced, greatly increasing both lookup and insertion speed. This does mean, however, that a graph can only have String XOR Integer ids now, not both at the same time.
  • We have updated to rust 1.80.0

What's Changed

  • Fix release by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1693
  • make the benchmark names consistent again by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1691
  • Fix benchmark names by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1694
  • Pre multi graph by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1695
  • Feature/more merge tests by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1702
  • Features/cached graphs by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1656
  • Feature/incremental protobuf by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1706
  • update rust version for readthedocs by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1708
  • Make sure the string interning happens on decoding protobuf files by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1711
  • much cleaner and easier way to test all the features compile by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1710
  • Post cache graphql fixes by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1709
  • Fix/dfview by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1712
  • Feature/cached graph by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1718
  • Tidy/ingestor by @shivam-880 in https://github.com/Pometry/Raphtory/pull/1714
  • GraphQL mutation apis by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1719
  • Update README.md by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1726
  • Release v0.11.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1727

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.10.0...v0.11.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.10.0

What's Changed

  • impl node_types for disk graph by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1641
  • move input node and hashing code to raphtory-api by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1671
  • Bump urllib3 from 2.2.1 to 2.2.2 in /docs in the pip group across 1 directory by @dependabot in https://github.com/Pometry/Raphtory/pull/1663
  • Parquet loader by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1666
  • Improve python extensibility by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1677
  • Make the edge storage more columnar to reduce memory usage by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1670
  • Stable serialise by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1683
  • Disk merge by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1678
  • Add Python type stubs by @hallofstairs in https://github.com/Pometry/Raphtory/pull/1682
  • Cleanup by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1689
  • Release v0.10.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1690

New Contributors

  • @hallofstairs made their first contribution in https://github.com/Pometry/Raphtory/pull/1682

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.9.3...v0.10.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.9.3

🚀 Performance improvements

  • Feature/par execution continued by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1630
  • Unlocked storage 2 by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1662
  • simple change to reduce memory usage by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1668

🐛 Bug Fixes

  • Fix/security dependencies by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1658
  • Bump the pip group across 2 directories with 8 updates by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1657
  • Fix/pyarrow by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1661
  • Fix/graphql server by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1665

📈 Benchmarking

  • Extra benches by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1651
  • Benchmark tweaks by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1654

📖 Documentation

  • Create SECURITY.md by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1655
  • Release v0.9.3 by @github-actions in https://github.com/Pometry/Raphtory/pull/1669

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.9.2...v0.9.3

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.9.2

New functionality and API changes

  • PersistentGraphs are now available as properties on the graph #1596
  • EventGraphs and PersistentGraphs can now be converted into eachother via into_graph and into_persistent_graph #1596
  • Changed the return type of layer_name and time from Option to Result - this means when they are called incorrectly the user will get an error (explaining when these functions should be used) instead of a None, which could easily be confused for the edge not having a layer name or timestamp. #1593
  • Added unique and ordered_dedupe functions on temporal properties #1603
  • Added a Temporal Bipartite projection #1396
  • Added node type filtering on Nodes PathFromGraph and PathFromNode #1510

GraphQL Improvements

  • Added Microsoft SSO/Authentication #1629
  • Set in/out/edges to return GQLEdges objects which can be correctly filtered and paged. #1585
  • Set in/out/neighbours to return GQLPathFromNode objects which can be correctly filtered and paged. #1585
  • Added an optional keys argument to the GQLProperties values function - meaning you can select a subset of the properties on the nodes without having to call value over and over. #1585
  • Added Apollo event tracing to find bottlenecks in your queries #1585
  • Removed node/edge filtering as it was ineffecient - all functionality is available now that graphql APIs are in parity with python/rust #1585
  • Removed several old/ultra specific functions which can now be better served by the standard APIs #1585

Bug fixes and performance improvments

  • Drastically improved the performance of the Eval APIs used for writing algorithms in Raphtory - this should see all algorithms written this way run faster. #1617 #1622
  • Reworked the temporal motif algorithms to use more efficient internal functions and data structures #1623
  • Fixed an issue with exploded edges panicking if a requested property wasn't present #1592
  • Graphql can now correctly index Boolean properties #1597
  • Exploded edges now return the correct value when calling first and last #1594
  • Fixed an issue in saving/loading graphs in python where save used relative paths, but load used absolute.
  • Added several new benchmarks to ensure no regressions in performance when making larger core changes.
  • Several documentation fixes

Structural Changes

  • There are several large structural refactors as part of this release, with another planned for 0.10.0 - these are to enable us to make both the Rust and Python libraries more extensible for developers building plugins. #1608 #1631

What's Changed

  • Bump tqdm from 4.65.0 to 4.66.3 by @dependabot in https://github.com/Pometry/Raphtory/pull/1588
  • Bump jinja2 from 3.1.2 to 3.1.4 by @dependabot in https://github.com/Pometry/Raphtory/pull/1589
  • fix issue with missing properties for exploded edges causing panic #1592 by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1595
  • Fix/graphql by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1597
  • fix exploded edges latest time #1591 by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1594
  • fixes #1583 by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1596
  • Bump scrapy from 2.11.1 to 2.11.2 by @dependabot in https://github.com/Pometry/Raphtory/pull/1601
  • Graphql improvements by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1585
  • Os master squashed by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1608
  • add hidearrowdep.sh by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1612
  • Fix readthedocs by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1613
  • Feature/layer name time by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1593
  • Performance fixes for the eval apis by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1617
  • Fix python non arrow by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1616
  • make localclusteringcoefficient benchmark actually useful again by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1618
  • add raphtory-arrow to .gitignore to avoid accidental commits/push by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1620
  • Raphtory api by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1621
  • Fix/performance by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1622
  • impl unique temporal props by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1603
  • Temporal bipartite projection by @narnolddd in https://github.com/Pometry/Raphtory/pull/1396
  • Bump requests from 2.31.0 to 2.32.0 by @dependabot in https://github.com/Pometry/Raphtory/pull/1607
  • impl node type filter for nodes, pathfromgraph and pathfromnode by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1606
  • run rust tests without arrow enabled to check that still works by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1626
  • supported empty node types while node type filtering by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1624
  • fix arrowgraph for gql by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1619
  • fix issue with path while saving and loading graphs by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1627
  • Motifs tidy ii by @narnolddd in https://github.com/Pometry/Raphtory/pull/1623
  • Refactor pre release by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1631
  • Added Microsoft Authentication to GraphQL by @Haaroon in https://github.com/Pometry/Raphtory/pull/1629
  • change key and perms for benchmark workflow by @Haaroon in https://github.com/Pometry/Raphtory/pull/1633
  • disbale internal dispatch by @Haaroon in https://github.com/Pometry/Raphtory/pull/1634
  • simplify the testing by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1632
  • Update readme.md by @Haaroon in https://github.com/Pometry/Raphtory/pull/1636
  • Release v0.9.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1637
  • update pometry-storage to the right version of raphtory-api by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1638
  • Added dryrun flag as now required for release by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1639
  • Fixed github release by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1640
  • github actions are sometimes stupid by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1642
  • add metadata required for release by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1643
  • fix the zip dependency by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1644
  • Release v0.9.1 by @github-actions in https://github.com/Pometry/Raphtory/pull/1645
  • Remove par iter from hot path by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1647
  • Fixed documentation to state nodes instead of edges for find_nodes by @brandon-haugen in https://github.com/Pometry/Raphtory/pull/1648
  • Release v0.9.2 by @github-actions in https://github.com/Pometry/Raphtory/pull/1652

New Contributors

  • @brandon-haugen made their first contribution in https://github.com/Pometry/Raphtory/pull/1648

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.8.1...v0.9.2

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.8.1

New Features

  • Exposed update_constant_properties on both the nodes and edges (was previously only available on the graph)

Version changes

  • Removed support for python 3.7
  • Bumped rust from 1.75 to 1.77

Bug fixes

  • Fixed a bug in the property aggregation methods where None's were being included in the results.
  • Changed the notebook argument in to_pyvis to be false by default.

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.8.0

Release 0.7.0

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.7.0...v0.8.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 1 year ago

Raphtory - v0.7.0

Release v0.7.0

What's Changed

  • Internal dispatcher by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1328
  • Added failure case to internal dispatch by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1329
  • Update internal_dispatch.yml by @Haaroon in https://github.com/Pometry/Raphtory/pull/1330
  • adding methods for layered edges in graphql by @rachchan in https://github.com/Pometry/Raphtory/pull/1331
  • Updated readme/examples by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1334
  • Fixed bug where we do not reset the task runner by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1335
  • Bump urllib3 from 1.26.17 to 1.26.18 by @dependabot in https://github.com/Pometry/Raphtory/pull/1337
  • Bump urllib3 from 1.26.17 to 1.26.18 in /docs by @dependabot in https://github.com/Pometry/Raphtory/pull/1338
  • Update rustformatcheck.yml by @Haaroon in https://github.com/Pometry/Raphtory/pull/1336
  • Algorithm Result object complete rewrite, Add betweeen centrality, Add Zaks Karate Club by @Haaroon in https://github.com/Pometry/Raphtory/pull/1327
  • Modify AlgoResult.get to accept Strings in rust by @Haaroon in https://github.com/Pometry/Raphtory/pull/1341
  • move usecase to main package by @Haaroon in https://github.com/Pometry/Raphtory/pull/1342
  • Feature/in out shake it all about by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1345
  • Extra Benchmarks for Algorithms using Large Generated Graphs by @Haaroon in https://github.com/Pometry/Raphtory/pull/1344
  • Adding methods for server side pagination by @rachchan in https://github.com/Pometry/Raphtory/pull/1343
  • added missing udpate constant proeprties from graphwithdeletions in p… by @Haaroon in https://github.com/Pometry/Raphtory/pull/1350
  • Added 'hard deletion' semantics by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1348
  • More caching during CI building by @Haaroon in https://github.com/Pometry/Raphtory/pull/1352
  • Feature/more caching by @Haaroon in https://github.com/Pometry/Raphtory/pull/1353
  • Strongly Connected Components Algorithm by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1349
  • Update testpythonworkflow.yml by @Haaroon in https://github.com/Pometry/Raphtory/pull/1359
  • fix graphs with dels by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1358
  • Multi document entities by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1339
  • disabled code cov workflow by @Haaroon in https://github.com/Pometry/Raphtory/pull/1364
  • already existing properties must be updated by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1363
  • fix edgelatesttime() in GraphWithDeletions and add a test by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1368
  • Fix id strings in graphql by @rachchan in https://github.com/Pometry/Raphtory/pull/1365
  • Dont fail benchmark if major change by @Haaroon in https://github.com/Pometry/Raphtory/pull/1372
  • dont-fail-benchmark-on-alert by @Haaroon in https://github.com/Pometry/Raphtory/pull/1373
  • Bump aiohttp from 3.8.5 to 3.8.6 in /docs by @dependabot in https://github.com/Pometry/Raphtory/pull/1376
  • Feature/improve time ops by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1371
  • Removed old examples, Created new monkey example by @Haaroon in https://github.com/Pometry/Raphtory/pull/1347
  • fix #327 by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1377
  • Fix rust toolchain version to 1.73.0 by @Haaroon in https://github.com/Pometry/Raphtory/pull/1378
  • bump rtd rust version by @Haaroon in https://github.com/Pometry/Raphtory/pull/1379
  • Feature/python index graph by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1117
  • Improvements for vectors python module by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1360
  • save archive by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1381
  • Adding some methods for the smart search dropdown button by @rachchan in https://github.com/Pometry/Raphtory/pull/1386
  • Add expansion filters by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1387
  • LPA Algorithm rust+python+docs+tests by @Haaroon in https://github.com/Pometry/Raphtory/pull/1390
  • Efficient version for global motif counts by @narnolddd in https://github.com/Pometry/Raphtory/pull/1322
  • Bump aiohttp from 3.8.6 to 3.9.0 in /docs by @dependabot in https://github.com/Pometry/Raphtory/pull/1395
  • Bump twisted from 22.10.0 to 23.10.0 by @dependabot in https://github.com/Pometry/Raphtory/pull/1397
  • Feature/one hop filters by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1393
  • fix the python test workflow by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1398
  • Adding some missing graphql functions by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1392
  • impl at and fix in/out degree by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1399
  • fix property semantics for the graph with deletions by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1400
  • fix wrong number of vertices returned by @iamsmkr in https://github.com/Pometry/Raphtory/pull/1409
  • Add graphql server handler and python wrapper for it by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1402
  • pull out the EdgeStore functionality into trait EdgeLike by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1405
  • Vector docs and cache improvements by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1391
  • Fix GraphQL queries with numbers and make embedding optional by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1410
  • Syncing functionalty between graphql and python by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1401
  • Vetrex 2 node by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1412
  • Allow externally defined LockedLayeredIndex by @fabianmurariu in https://github.com/Pometry/Raphtory/pull/1411
  • Fix compilation for different feature combinations by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1416
  • Fixed graphql docs by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1413
  • event based temporal SEIR algorithm by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1415
  • add search feature to graphql by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1417
  • Fix save_graph GQL mutation so it does not create multiple files for the same graph name by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1419
  • Feature/history datetime by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1420
  • Added date_time history/items to Temporal properties by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1423
  • Louvain algorithm by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1425
  • Release v0.7.0 by @github-actions in https://github.com/Pometry/Raphtory/pull/1427

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.6.1...v0.7.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 2 years ago

Raphtory - v0.6.1

Release v0.6.1 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 2 years ago

Raphtory - v0.6.0

Release v0.6.0 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 2 years ago

Raphtory - v0.5.7

Release v0.5.7 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.5.6

Release v0.5.6

What's Changed

  • Feature/temporal edges by @narnolddd in https://github.com/Pometry/Raphtory/pull/1241
  • Removed unwarp in getter for results by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1242
  • implement explode_layers for edges in python by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1244
  • Improved property additions api for vertices and edges by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1228
  • Added U8 and U16 property types by @Haaroon in https://github.com/Pometry/Raphtory/pull/1248
  • add tests and fix edgeearliesttime() when the default layer is empty by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1249
  • Created new export methods and updated notebooks by @rachchan in https://github.com/Pometry/Raphtory/pull/1230
  • Release v0.5.6 by @github-actions in https://github.com/Pometry/Raphtory/pull/1252

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.5.5...v0.5.6

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.5.5

Release v0.5.5

What's Changed

  • sum weight algorithm + min/max/mean/median/average/count/len/sum features on edge properties by @Haaroon in https://github.com/Pometry/Raphtory/pull/1200
  • Release v0.5.5 by @github-actions in https://github.com/Pometry/Raphtory/pull/1227

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.5.4...v0.5.5

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.5.4

Release v0.5.4

What's Changed

  • Performance improvements by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1202
  • Tidied up the output for vertex/edge/graph by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1213
  • Changing property type now returns an error instead of silently ignoring the value by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1211
  • rename edgeechema to edgeschema by @Dullaz in https://github.com/Pometry/Raphtory/pull/1220
  • Fix input argument for subgraph in python by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1218
  • Updated docs to just be the python APIs by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1222
  • Add method to return TimeIndexEntry for exploded edge by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1221
  • Release v0.5.4 by @github-actions in https://github.com/Pometry/Raphtory/pull/1223

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.5.3...v0.5.4

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.5.3

Release v0.5.3

What's Changed

  • Bump tornado from 6.3.2 to 6.3.3 in /docs by @dependabot in https://github.com/Pometry/Raphtory/pull/1179
  • roundtrip support for sending and receiving graphs using base64-encoding by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1182
  • Added GraphQL Client by @Haaroon in https://github.com/Pometry/Raphtory/pull/1185
  • add layer fn by @Haaroon in https://github.com/Pometry/Raphtory/pull/1194
  • add schema for layers and edges by @ricopinazo in https://github.com/Pometry/Raphtory/pull/1196
  • Pandas loading bars by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1197
  • Small changes to docs before the big update by @miratepuffin in https://github.com/Pometry/Raphtory/pull/1199
  • Update README.md by @Alnaimi- in https://github.com/Pometry/Raphtory/pull/1201
  • Bug/windowed output by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1207
  • refactor(graphql): rename filters to use snake case naming by @Dullaz in https://github.com/Pometry/Raphtory/pull/1204
  • fix property gets and add directed option to pyvis by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1206
  • feat(graphql): Extend property filtering to edges in graphql by @Dullaz in https://github.com/Pometry/Raphtory/pull/1203
  • feat(graphql): allow searching for multiple property histories in one… by @Dullaz in https://github.com/Pometry/Raphtory/pull/1205
  • Release v0.5.3 by @github-actions in https://github.com/Pometry/Raphtory/pull/1208

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.5.2...v0.5.3

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.5.2

Release v0.5.2 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.5.1

Release v0.5.1

The patch is to fix an issue where windowed graphs were running slower in 0.5.0 than in 0.4.3. This has been drastically improved in 0.5.1, but a couple of other performance bottlenecks have also been noticed during profiling. These shall be fixed this week and released in a second patch.

What's Changed

  • Feature kcore by @narnolddd in https://github.com/Pometry/Raphtory/pull/1123
  • GQL demo notes by @Haaroon in https://github.com/Pometry/Raphtory/pull/1170
  • Bug/performance by @ljeub-pometry in https://github.com/Pometry/Raphtory/pull/1169
  • Release v0.5.1 by @github-actions in https://github.com/Pometry/Raphtory/pull/1176

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.5.0...v0.5.1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.5.0

Release v0.5.0 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.4.3

Release v0.4.3 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.4.2

Release v0.4.2 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.4.1

Release v0.4.1 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.4.0

Release v0.4.0 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.3.2

Release v0.3.2 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - v0.3.1

Raphtory 0.3.0 Release - In Rust we trust 🦀

Thanks to a whole bunch of feedback on our Python alpha, over the last 6 months Raphtory has been through its second full make over with a total rewrite of the core engine in Rust! There are WAY too many changes to list here, but below you can see a couple of highlights.

If you would like to give this new version a go, you can check out the docs as well as our examples - available in both Python and Rust. Good places to start are the Jupyter notebooks for the Reddit snap dataset and Enron emails.

Highlights 🏆

Revamped API

The first thing you will notice about the new Raphtory is that the API is A LOT more friendly. The example notebooks above show this off nicely, but as a snippet this is how you could grab Gandalf from our Lord of the Rings Graph and plot his degree every 1000 time increments:

```python timestamps = [] degree = [] for gandalf in g.vertex("Gandalf").rolling(window=1000): timestamps.append(gandalf.latest_time()) degree.append(gandalf.degree())

sns.setcontext() ax = plt.gca() plt.xticks(rotation=45) ax.setxlabel("Time") ax.set_ylabel("Interactions") sns.lineplot(x = timestamps, y = degree,ax=ax) ``` image

Performance 📈

  • The memory usage of Rust is over an order of magnitude less than Scala, with one test graph (~11 million nodes, ~33 million edges) previously requiring ~120GB of Ram now only needing 7GB! This means that datasets which required spinning up a EC2 instance or cluster can now easily be run on your laptop 💪🏻
  • Similarly, complex algorithms like Temporal Triadic Motifs run in seconds instead of hours - even when running locally instead of on a beefy box 🍖
  • Querying for specific vertices/edges runs 1000x faster and can be done directly on the graph via the new APIs instead of having to write a full algorithm.

Python 🐍

  • Raphtory can now be easily installed with all dependencies via pip install raphtory.
  • Via PyO3 Raphtory can now be run and called directly in python without secretly running a Java Runtime Environment in the background 🥷. This also means it now works perfectly with all other python libraries!
  • The vast majority of the heavy lifting is done in Rust, meaning you get all the ease of Python, with very little slow down!

Whats next ⏭️

We are currently tinkering away with several parts of the new APIs, adding more helper functions, and expanding the algorithmic suite. However, alongside this we have some larger pieces of work in the pipeline:

  • We are building a GraphQL extension to Raphtory, codename flux-capacitor, alongside the functionality for compiling Raphtory to WASM - making it possible to interact with Raphtory through Javascript/web UIs.
  • We are working on out-of-core analysis, allowing Raphtory to work on Graphs many times the size of the memory of the machine it is running on.
  • Finally, we are running a suite of standard benchmarks on this new version to give some concrete comparable numbers to other Graph systems.

If you have an other suggestions please do let us know via Github issues, discussions or on Slack!

Full Changelog: https://github.com/Pometry/Raphtory/compare/v0.2.0...v0.3.1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] over 2 years ago

Raphtory - raphtory-scala-0.2.2

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] almost 3 years ago

Raphtory - raphtory-scala-0.2.1

Release v0.2.1 - [x] Publish to crates.io - [x] Publish to PyPi - [x] Make Tag - [x] Release to Github - Auto-generated by [create-pull-request] triggered by release action 1

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] almost 3 years ago

Raphtory - raphtory-scala-0.2.0

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] almost 3 years ago

Raphtory - raphtory-scala-0.1.6

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] almost 3 years ago

Raphtory - raphtory-scala-0.1.5

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] almost 3 years ago

Raphtory - raphtory-scala-0.1.4

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 3 years ago

Raphtory - raphtory-scala-0.1.3

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 3 years ago

Raphtory - raphtory-scala-0.1.0

Raphtory 0.1.0 Release :hourglassflowingsand:

Over the last 6 months Raphtory has gone through a full rebuild, with the majority of the original project deprecated as raphtory-akka. This includes replacing all the underlying tech stack, remaking both ingestion and analysis API's, totally reworking local and distributed deployment and adding on a host of wonderful bells and whistles to boot. As such we have had a bit of a rebrand and are considering this the official Raphtory 0.1.0 release!

Below is a small summary of the new features that have been introduced. We shall soon be following up with individual blog posts on each. You can also read an in-depth dive in our Documentation.

Thanks to everyone who helped bring this together! Looking forward to the many exciting things we have planned for the future of Raphtory :rocket: :sparkles:

Getting data in and out of Raphtory :inboxtray: :outboxtray:

  • Spouts and Graph Builders have been rewritten to be more flexible.
    • They now interact via any serialisable class instead of just strings.
    • Spouts now extend Iterable, requiring only a next() and hasNext() function - making them far easier to get non-standard datasources into.
  • Output of algorithms is now handled by the Sink and Format interfaces. These define how to output your results to a location and the serialised format this should take.
    • This allows code to connect to say AWS S3 to be defined once, and used in combination with a format for CSV, TSV, JSON, XML, etc
    • This also enables us to define global formats, including all perspectives i.e. a singular valid JSON object for your whole query instead of individual JSON objects per-vertex as before.
  • We have added a new connectors sub-project to the repository containing all the different Spouts and Sinks we support out of the box. These can be imported into your project as required and support a variety of things from AWS S3 to the Twitter Firehose.

Graph and Algorithmic Engine :abacus:

  • step(), iterate(), select() and tabularise() as the main algorithmic flow operators can now be performed in any sequence.
  • Algorithms may be composed together with the -> operator .
  • Small amounts of global graph state can be stored as aggregators such as sum, product, min, max, any, all, within the algorithmic flow.
  • Histogram API for storing distributions of vertex and edge quantities for algorithms and extracting quantiles.
  • Introduction of vertex and edge filters for creating subgraph views of a perspective.
  • Many new algorithms including three-node motifs, temporal taint tracking, max flow, prisoners' dilemma and more.
  • Temporal Multilayer View for modelling a temporal graph as a multilayer graph of snapshots with interlayer edges.
  • Support and convenience functions for weighted networks and merging strategies for converting multiple temporal edges into a single weighted edge within a perspective.
  • A host of convenience functions within the Vertex and Edge visitor objects, enabling cleaner algorithm code. ## Graph perspective API :mag:
  • More flexible ways of time slicing for expressing temporal queries using function composition. (see the documentation page for a full description of the new API on this).
  • Name changes of pointquery(), rangequery() and livequery() to at(), climb(), depart() respectively.
  • Support for natural language time descriptors on top of existing long timestamp specification. E.g. 25 June 2022, windowsize = 1 day.
    • Increments and windows may be composed of multiple time frames with commas and 'and' to allow natural text. For instance, the interval "1 month 1 week 3 days" can equally be rewritten as "1 month, 1 week, and 3 days"
  • Full handling of time including leap years, different month lengths and time zones.

Raphtory Internals :gear:

  • Raphtory now runs predominantly on top of Apache Pulsar, with Akka being used for analysis control messages.
    • This means that all components are decoupled and can message eachother without fear of data being lost or causing a crash due to huge amounts of backpressure.
    • This messaging is built on top of a communication layer abstraction which allows the medium for each topic (comms between two component types) to be set within conf. In later versions of Raphtory this will be exposed to the user, allowing Raphtory to run on other message brokers/technology stacks.
  • Cluster management is now handled by zookeeper, which provides a central location to track partition IDs and store addresses for service discovery.
  • We have begun a transition into Typelevel Cats :hearteyescat: for better state management and execution. This will be finalised in the next version.

Deployment :shipit:

  • Raphtory has a new deployment API where local deployments are created through either Raphtory.load() for closed datasets or Raphtory.stream() for streaming datasets.
    • This returns a Temporal Graph where queries can be built up in a much more expressive fashion as explored above.
  • The Raphtory Service for distributed deployments has been fully overhauled, allowing all components to be easily spun up on bare-metal or as a container. For those wanting to give this a try, the process is fully documented on our ReadTheDocs page described below.
  • To support automation and large scale deployments Raphtory is fully integrated with Kubernetes.
    • We have even created a Deploy sub-project in the repo that will allow you to automatically spin up and shut down Raphtory components via fabric8.
  • Whether you are running a local deployment or a distributed deployment you can now spin up a Client which can attach and submit new queries, with the results output to any Sink specified.
    • This client interacts with Raphtory through the same TemporalGraph API as the local deployments.
  • Raphtory 0.1.0 is now available on Maven, meaning you no longer need to build any of the jars. This includes the core, connectors and deploy packages.

Testing, Logging and Metrics :chartwithupwards_trend:

  • Testing suite for algorithmic correctness and integration of all Raphtory components.
  • CI/CD pipeline for all PR's to Raphtory complete with test and build of core, connectors and the examples.
  • The scourge of println's has been replaced with logging throughout all packages, appropriately levelled and configurable through environment variables
  • Metrics have been reenabled and expanded, encompassing the full ingestion and analysis pipeline. These are handled by Telemetry and scraped via Prometheus.

Documentation and Examples :book:

  • Getting set up with Raphtory, understanding the underlying frameworks and creating your own projects on top is fully explained in our new ReadTheDocs tutorials.
  • Several example projects are now available within the repository covering social networks, cryptocurrencies, interaction networks and more. All of these can be used as a basis for your own applications.
  • Every user facing function is fully commented and searchable via ScalaDocs.
  • All algorithms included as part of Raphtory core have their purpose and parameters fully explained here.

Python Raphtory Client (Alpha) :snake: :construction_worker:

  • A Raphtory client for Python has been created for submitting established queries to a running Raphtory instance, meaning it is not necessary to interact with the Scala code after the initial setup, if preferred.
  • Algorithm results can be outputted to this client for postprocessing and visualisation in Python.
  • This is a new feature and will become more established with functionality and stability in the next release.

Bug fixes :bug:

  • Far too many to list here due to the full rewrite. But trust me there were a lot.

Scientific Software - Peer-reviewed - Rust
Published by miratepuffin over 3 years ago

Raphtory - raphtory-akka-0.4.1

Prior to the rebuild of Raphtory on top of Pulsar, there have been several fixes and updates to the prior 0.4.0 version.

Primarily these changes consisted of:

  • Porting 0.4.0 to the new composable analysis API.

  • Updating the algorithms to fit the new functions.

  • Minor refactors and bug fixes

Scientific Software - Peer-reviewed - Rust
Published by miratepuffin over 3 years ago

Raphtory - raphtory-akka-0.4.0

0.4.0 is a drastic overhaul over almost every component within Raphtory. This includes:

  1. A new analysis engine with a clearer more intuitive API;
  2. A full rework of Raphtory orchestration, allowing for clean local and distributed deployment;
  3. Batching and backpressure added between all components, improving stability and providing 10-100x speed up in ingestion and analysis conversion;
  4. Integration tests for all update types, different analysis tasks and windowed perspectives;
  5. CI/CD built on top of the tests for automated testing of branches, publishing of nightly builds and release tagging.

Analysis Control Overhaul

  • Added the Query Manager and Query Handler to deal with the organisation of a query and replace the Analysis Manager/Task Handlers.
  • Added PerspectiveControllers which look after all perspectives (combinations of timestamp + windows) within a job.
  • Added the QueryExecutor inside of each Partition to run submitted algorithms - replacing the AnalyserExecutor.
  • Centralised safetime checking within the watermarker instead of asking all the Executors independently.
  • Removed all REST api and replaced with a programatic RaphtoryClient which can be run via a compiled Jar or via the scala REPL.

New Graph Algorithm Structure

  • Added Graph Algorithm, Graph Perspective and Table traits as the components of our new algorithm API.
  • Graph algorithms consist of calling Step and Iterate on the graph perspective - these take a function to run on each vertex. This massively expands the analytical facilities of Raphtory allowing the chaining of multiple algorithmic steps.
  • Once an algorithm has been defined via step/iterate the user may call select which converts each vertex to a row and returns a table abstraction. This table may be filtered, exploded (turning one row into N rows as defined by a user given function) and then written to disk via writeTo.
  • Global aggregation is currently removed as it was causing several issues in the previous analytical model. Elements such as counting, groupBy, topK, etc. will be added in the next minor version.

New Analysis Features

  • Added Explode Edges and helpers to view Temporal Edges as singular entities (one for each update).
  • Added a global vertex count within Graph Algorithms via graph.nodeCount which changes based upon the perspective.
  • Added an equivalent function to assignID inside of the graphAlgorithm called checkID this is a helper function which allows the user to feed queries with the strings that exist in the raw data and convert these to the internal long ID.
  • Changed property access to take a class tag (i.e. getState[String]()) instead of requiring .asInstanceOf[T]
  • Added getStateOrElse to vertex visitor.

Deployment Overhaul

  • Moved away from docker fully, allowing Raphtory to be compiled into a Jar and deployed on bare metal.
  • Organised deployment classes into RaphtoryGraph for local deployment and RaphtoryService for distributed deployments.
  • Added a RaphtoryClient for users to submit jobs to either Graph or Service.
  • Converted the Raphtory Component (top level akka handler of spout, builder, partition, etc) into a Component Factory Object used by all deployment classes i.e. the RaphtoryGraph and RaphtoryService
  • Moved creation of Spout and Builder away from Scala reflection to allow them to have multiple parameters.

Message Batching

  • Batched the messages between the spout and the builders to minimise the amount of akka messages sent between them. The size of this is configurable by RAPHTORY_BUILDER_BATCH_SIZE.
  • Added a outgoing queue map for the builder (one queue for each partition) which will be pulled when the partition is ready for more data.
  • Added RAPHTORY_BUILDER_MAX_CACHE for the total amount of messages a builder will hold before it stops pulling data from the spout (to stop it becoming memory overloaded itself).
  • Added RAPHTORY_PARTITION_MIN_QUEUE which is number of messages in the queue of each partition actor below which the Partition Manager will request more data from the builders.
  • Batched effect sync messages between partitions which are pushed out every second.
  • Batched vertex messages between Readers during analysis, which are flushed after each superstep has concluded on all vertices in the perspective.
  • Changed ChannelID between the builder/partition to be Ints instead of strings and only send 1 per batch.

Message Handling

  • Swapped to Twitter Chill library for kryo serialisation instead of altoo-ag. This removed the need to specify each case class manually in the conf and allows users to send their own types.
  • Moved all actors onto the large message queue - allowing heartbeats etc to use the normal queue unopposed - shrinking the queue size to 100k, but increasing each message frame to 10MB.
  • Bumped up heartbeat monitoring to stop akka complaining when actors are looping through a batch of messages.
  • Added a new custom mailbox which tracks the amount of messages in each actors queue to get a better idea of workload. This is how the Partition Manager knows how much data each partition has to process.
  • Swapped the vertex message queue to use ArrayBuffer instead of ListBuffer
  • Swapped the watermarker to ask the watchdog when the cluster is ready before probing for timestamps to stop fake dead letters.

Testing:

  • Added a new version of the all commands test, which is more extensible than the prior and works with the new API. This also doesn't require the golden standard data to be available, instead comparing hashes. The data has also been removed from the repo and is now pulled into /tmp within a users first run.
  • Added a Raphtory pseudo distributed deployment class (RaphtoryPD) which simulates a real distributed environment for testing.
  • Adding speed logging to All commands test for ingestion and queries
  • Added speed logging to the Query Manager for all jobs.

CI/CD

  • Added CI pipeline workflow via GitHub actions which will - Run the all commands test on push to any branch that isn’t master - Run a nightly build of develop branch and publish a tag and release on successful build - Run a build on push to master branch, bump semantic version, create a tag and release on successful build
  • Added in badges to readme to show latest build run status for push and scheduled events
  • Added in badges to readme to show latest tag and release versions (SemVer only as to only show published release rather than nightly builds)

Partition Overhaul

  • Have abstracted the graph partition so that we can work on the storage analysis and ingestion separately. They were very intertwined before.
  • Have removed the concept of a local partition/partitioned shared state as this means we can move partitions round a lot easier and support other non-object based partitions i.e. arrow.
  • Turned the object based entity visitors and graph lens into interfaces so that we can easily see what a user will have access to + wrapper functions. This also further separates the storage and analysis.
  • Current version of the entity storage implements these and has been renamed as POJOGraph to make it distinct from later implementation in frameworks such as arrow.
  • Reworked all the worker classes (router/writer/reader) to have a unique name and not reference the machine they are on.
  • Turned the actor lookup functions within the RaphtoryActor into lazy vals so that they do not reinitialise every call.
  • Removed all ParTrieMaps (our last parallel data structure) as these were causing resource contention.

Partition Memory Management:

  • Swapped all multiple.treemaps to ArrayBuffers and moved to using arrays in analysis were possible as these are apparently more efficient based on recent benchmarks (https://www.lihaoyi.com/post/BenchmarkingScalaCollections.html).
  • Added a state deduplication step run periodically in the partitions to remove any state which is stored more than once (say in the instance of a vertex added at the same time as some of its edges).
  • Removed the HistoricOrdering object as it is no longer used without the trees and one was being instantiated for each entity in the graph taking huge amounts of memory.

Spout

  • Deleted the multiline file spout as not used.
  • Added a mongoDB spout.
  • Added a parquet spout.
  • Fixed the Kafka spout to work with the overhaul from 0.3.0

Config

  • Added RAPHTORY_LEADER_ADDRESS, RAPHTORY_LEADER_PORT, RAPHTORY_BIND_ADDRESS, RAPHTORY_BIND_PORT for specifying where a Raphtory service should be binding to and where to look for the leader of a deployment.
  • Added RAPHTORY_DATA_HAS_DELETIONS flag to only run the extra steps for handling deletions which such elements exist in the data.

Misc clean up

  • Removed all env variables throughout the code, notably in spouts and algorithms - these are all now taken as class arguments.
  • Tided up the Raphtory components and placed previously duplicated akka code such as the mediator into the top level Raphtory Actor.
  • Added a Windows type as a wrapper to List[Long] to better explain what is happening when you submit a query
  • Shortened Raphtory job names, removing the full algorithm path.
  • Deleted env-setter as no longer using raphtory docker image.
  • Deleted old docker settings inside of build.sbt as we no longer build straight into docker.
  • Removed all the old compile at runtime code as now depreciated.
  • Removed old Kamon logging code which caused deadlocking issues.
  • Removed the Router Manager and fully renamed the router to graph builder throughout.
  • Deleted unneeded utils and and actors, including the original seed actor.
  • Deleted the old Snapshot Manager
  • Increased the frequency of watermarking
  • Added logging info of the IP of each Partition joining a Raphtory cluster to better discern where an issue arrises from.

Scientific Software - Peer-reviewed - Rust
Published by github-actions[bot] about 4 years ago

Raphtory - raphtory-akka-0.3.0

A large number of changes have occurred in dev causing it to diverge largely from master and current documentation. Before any larger changes are completed (notably snapshotting, breaking away from docker and the creation of a new analysis API) we are releasing 0.3.0. The changes for this are listed below:

Major Changes - Raphtory Management - Raphtory have been upgraded to use Akka 2.6 and swapped from Netty to Artery - All messaging is now handled through Kryo serialiser instead of the default Java serialiser - The Watchdog SeedNode and Watermark Manager are now combined into an orchestration actor group that manages the whole cluster. - All Raphtory Components are now managed by a Raphtory Component Connector which ensures cluster startup by reporting to the watchdog. - Writer Workers can now martial and un-martial the state of their allocated entity storage to/from parquet.

Major Changes - Analysis Management - Raphtory’s logic for handling analysis has been totally rewritten. The Analysis Manager now spawns a task that contains the full control logic for each submitted query. This task requests the Reader Workers to create a separate actor for the analysis (the AnalysisSubtaskWorker) which contains all vertex visitors. Once the analysis is completed (across all flattenings) both the Task and SubtaskWorkers can be killed, removing all analytical states and stopping the build-up of visitors/analysis properties over time. - The above drastically simplified the VertexMultiQueue which now only needs an odd and an even mailbox instead of storing timestamp and windowsize as well. - PubSub was removed as a communication method between Analysis Task and SubtaskWorkers in favour of direct actor messaging. Completed for performance and practical reasons (new actors spawning requires gossiping of their location which is slow and causes intermittent errors). - VertexMessageHandler was created to track all vertex messages between SubtaskWorkers. - ViewLens and WindowedLens compressed into one class (GraphLens)

Major Changes - Analysis API - Analysers now require the user to return a map of results which can then be serialised in a variety of ways. This makes the analyser more general and removes the need to edit the code when the user wants to swap from saving to a text file to saving to mongo etc. - Raphtory queries may now be submitted with a serialiser class which contains the logic to save the results in the users desired format. - Raphtory Serialisers handle both windowed and unwindowed flattenings, therefore, ProcessResults and ProcessWindowResults have been replaced with extractResults, removing A LOT of duplicated code. - The old serialiser type which extended Analyser is now removed as redundant. - Analysers are now typed, specifying what each subtask worker is returning and, therefore, what the analysis task is aggregating. This removes the need for unpleasant casting inside of extractResults. - The Query API has had the explicit window type arguments removed (true, false, batched). A user may now simply submit a window set (which can include one window) and raphtory will handle it internally. - Vertex Visitor and Edge Visitor were renamed to Vertex and Edge for user clarity. - Double args array submission is now no longer possible with the RaphtoryGraph removing confusion. - Example algorithms have been updated with the new API - Example Algorithms have been given named param alternatives to the args array.

Test Changes - All Commands Test changed to use set generated file as all scala versions seem to do something different in utils.Random (see testUpdates.txt in dev/allcommands) - Datablast Analyser added which throws large arrays of data from all subtask workers to see how well Raphtory handles it. - All commands test converted to unit tests which are fully automated to make comparisons between versions a lot simpler.

Minor Changes - build.sbt has been cleaned up and organised - A large amount of package refactoring ahead of breaking the project into core + modules - The router has been officially renamed GraphBuilder - Initial SnapshotManager included, but currently stub - Initial GraphAlgorithm included, but currently a stub - AnalysisUtils created for misc runtime compilation code. - Swapped from 32 bit murmur3 hash to 64 bit xxHash to remove chances of collisions.

Scientific Software - Peer-reviewed - Rust
Published by miratepuffin over 4 years ago

Raphtory - raphtory-akka-0.2.0

Changelog for v0.2.0

API Changes

  • Changed the Graph Builder API such that instead of having to define a graph update case class and pass it to the sendUpdate() function, each update type has its only function. These are then overloaded to cleanly handle properties and types.

Testing

  • Created the Raphtory Component which runs into its own JVM allowing the deployment of Raphtory 'clusters' locally for better testing.
  • Created an all commands test generator which runs 300k updates of all types across a distributed deployment.
  • Added a StateTest algorithm which extracts the full structural and property histories from a flattening.
  • Added functionality to compare versions of Raphtory
    • Requires running the all commands test, then querying the new state test and connected components across the history of the resulting graph.
    • The results of the prior version and new version can then be compared by a new ResultsCompare class which pulls the data from mongo and reports on if it is correct and if a speed up has been obtained.
  • These can all be found in com.raphtory.dev.allcommands

Internal Improvements

  • Fixed the Watermarking functionality.
    • All router workers now synchronise fully for bounded datasets.
    • All ingestion workers now report the correct safe time.
    • Safe times are now aggregated fully in the new Watermark Manager.
  • Fixed bug in Router Workers where they were sharing an outbound queue object.
  • Fully refactored the messages for Update ingestion and synchronisation.
  • Extracted all message parsing logic from Entity Storage and moved to Ingestion worker -- both cleaned up addressing poor function names.

Analysis

  • Added a variety of new algorithms -- experimenting with Community Detection, temporal mutli-layer LPA and temporal motif counting.

    • These can be found in com.raphtory.algorithms
  • Entity Visitor Property access has been expanded, but is to be fully redone in the next version.

Extra Bits

  • Fully updated readme and documentation.
  • Large clean up of the overall project, removing old readme information/pictures, PDF's and other elements which can be moved to the examples repository.
  • Moved the src code to be top level.
  • Added multi-line Spout, to be merged into standard file spout - can be found in com.raphtory.spouts
  • Added a dev folder for alpha algorithms and example Raphtory pipelines for testing.

Thanks @wuliaososhunhun @imanehaf @dorely103 @narnolddd @richardclegg @felixcdr @jamesalford @Haaroon @Alnaimi-

Scientific Software - Peer-reviewed - Rust
Published by miratepuffin almost 5 years ago

Raphtory - raphtory-akka-0.1

Initial Raphtory release now that it is in a useable state to ingest and build the graph. This is a test release for current users and will soon be superseded by v0.2 which will include an updated analysis model.

Scientific Software - Peer-reviewed - Rust
Published by miratepuffin about 5 years ago