Skip to content

Releases: Pometry/Raphtory

v0.11.3

06 Sep 16:52
764e7ea
Compare
Choose a tag to compare

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

Full Changelog: v0.11.2...v0.11.3

v0.11.2

03 Sep 23:35
dab5563
Compare
Choose a tag to compare

Release v0.11.2

v0.11.1

02 Sep 14:57
fcf885a
Compare
Choose a tag to compare

Release 0.11.1

Bug Fixes

  • Exposed delete on edge in python
  • Fixed missing DTime parsing on Python properties
  • Fixed a bug in import_node(s)/import_edge(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.
client = graphql.RaphtoryClient(url="http://localhost:1736")
### RaphtoryClient functions
client.new_graph(path)

### RemoteGraph Functions
client.graph(path).add_node()
client.graph(path).add_nodes()
client.graph(path).add_edge()
client.graph(path).add_edges()
client.graph(path).delete_edge()
client.graph(path).add_properties()
client.graph(path).add_constant_properties()
client.graph(path).update_constant_properties()

### RemoteNode functions
client.graph(path).node(name).add_constant_properties()
client.graph(path).node(name).set_node_type()
client.graph(path).node(name).update_constant_properties()
client.graph(path).node(name).add_updates()

### RemoteEdge functions
client.graph(path).edge(src,dst).delete()
client.graph(path).edge(src,dst).add_constant_properties()
client.graph(path).edge(src,dst).update_constant_properties()
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

Full Changelog: v0.11.0...v0.11.1

v0.11.0

23 Aug 16:20
9bb4299
Compare
Choose a tag to compare

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:
from raphtory import Graph
g= Graph() #Create new graph

g.add_edge(1,1,2)
g.add_edge(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.add_node(2,3)
g.add_edge(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:

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 add_edge{ 
        updateGraph(path: "example_graphs/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 node_type via load_node_props_from_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

Full Changelog: v0.10.0...v0.11.0

v0.10.0

15 Jul 13:23
d8752c3
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.9.3...v0.10.0

v0.9.3

20 Jun 15:25
6b70f9d
Compare
Choose a tag to compare

Release v0.9.3

v0.9.2

10 Jun 17:04
1c7a7d7
Compare
Choose a tag to compare

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

New Contributors

Full Changelog: v0.8.1...v0.9.2

v0.8.1

01 May 16:00
545069c
Compare
Choose a tag to compare

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.

v0.8.0

15 Apr 20:04
baecde7
Compare
Choose a tag to compare

What's Changed

New Contributors

**...

Read more

v0.7.0

21 Dec 17:32
c382036
Compare
Choose a tag to compare

Release v0.7.0

What's Changed

Full Changelog: v0.6.1...v0.7.0