Skip to content

Commit 86fa0d6

Browse files
authored
Merge pull request #173 from neo4j/gds/rel-properties
gds/rel properties
2 parents d241095 + b7999e9 commit 86fa0d6

File tree

4 files changed

+118
-86
lines changed

4 files changed

+118
-86
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
## New features
88

99
* Allow visualization based only on relationship DataFrames, without specifying node DataFrames in `from_dfs`
10+
* Add relationship properties to `VisualizationGraph` when constructing via `from_gds`.
1011

1112
## Bug fixes
1213

examples/gds-example.ipynb

Lines changed: 90 additions & 79 deletions
Large diffs are not rendered by default.

python-wrapper/src/neo4j_viz/gds.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ def _node_dfs(
2222

2323

2424
def _rel_df(gds: GraphDataScience, G: Graph) -> pd.DataFrame:
25+
relationship_properties = G.relationship_properties()
26+
27+
if len(relationship_properties) > 0:
28+
if isinstance(relationship_properties, pd.Series):
29+
relationship_properties_per_type = relationship_properties.tolist()
30+
property_set: set[str] = set()
31+
for props in relationship_properties_per_type:
32+
if props:
33+
property_set.update(props)
34+
35+
return gds.graph.relationshipProperties.stream(
36+
G, relationship_properties=list(property_set), separate_property_columns=True
37+
)
38+
2539
return gds.graph.relationships.stream(G)
2640

2741

@@ -89,10 +103,10 @@ def from_gds(
89103
df.rename(columns={"labels": "__labels"}, inplace=True)
90104
df["labels"] = lbl
91105

92-
node_lbls_df = pd.concat([df[["id", "labels"]] for df in node_dfs.values()], ignore_index=True, axis=0)
93-
node_lbls_df = node_lbls_df.groupby("id").agg({"labels": list})
106+
node_labels_df = pd.concat([df[["id", "labels"]] for df in node_dfs.values()], ignore_index=True, axis=0)
107+
node_labels_df = node_labels_df.groupby("id").agg({"labels": list})
94108

95-
node_df = node_props_df.merge(node_lbls_df, on="id")
109+
node_df = node_props_df.merge(node_labels_df, on="id")
96110

97111
rel_df = _rel_df(gds, G)
98112
rel_df.rename(columns={"sourceNodeId": "source", "targetNodeId": "target"}, inplace=True)

python-wrapper/tests/test_gds.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ def test_from_gds_integration(gds: Any) -> None:
2424
{
2525
"sourceNodeId": [0, 1, 2],
2626
"targetNodeId": [1, 2, 0],
27+
"cost": [1.0, 2.0, 3.0],
28+
"weight": [0.5, 1.5, 2.5],
2729
"relationshipType": ["REL", "REL2", "REL"],
2830
}
2931
)
@@ -46,12 +48,16 @@ def test_from_gds_integration(gds: Any) -> None:
4648

4749
assert len(VG.relationships) == 3
4850
vg_rels = sorted(
49-
[(e.source, e.target, e.properties["relationshipType"]) for e in VG.relationships], key=lambda x: x[0]
51+
[
52+
(e.source, e.target, e.properties["relationshipType"], e.properties["cost"], e.properties["weight"])
53+
for e in VG.relationships
54+
],
55+
key=lambda x: x[0],
5056
)
5157
assert vg_rels == [
52-
(0, 1, "REL"),
53-
(1, 2, "REL2"),
54-
(2, 0, "REL"),
58+
(0, 1, "REL", 1.0, 0.5),
59+
(1, 2, "REL2", 2.0, 1.0),
60+
(2, 0, "REL", 3.0, 1.5),
5561
]
5662

5763

0 commit comments

Comments
 (0)