Skip to content

Commit f6c9699

Browse files
committed
[WIP] node properties alias
1 parent 143270f commit f6c9699

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

graphdatascience/graph/graph_cypher_runner.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ def project(
185185

186186
match_part = str(match_part)
187187

188+
print("nodes", nodes)
189+
print("labels", label_mappings)
190+
188191
case_part = []
189192
if label_mappings:
190193
with_rel = f", {rel_var}" if rel_var else ""
@@ -263,14 +266,21 @@ def _node_properties_spec(self, spec: Any, name: Optional[str] = None) -> NodePr
263266
if isinstance(spec, str):
264267
return NodeProperty(name=name or spec, property_key=spec)
265268

266-
if name is None:
267-
raise ValueError(f"Node properties spec must be used with the dict syntax: {spec}")
269+
if isinstance(spec, dict):
270+
name = spec.pop("name", name)
271+
if name is None:
272+
raise ValueError(
273+
f"Node properties must specify either a name in the outer dict or by using the `name` key: {spec}"
274+
)
275+
property_key = spec.pop("property_key", name)
276+
277+
return NodeProperty(name=name, property_key=property_key, **spec)
268278

269279
if spec is True:
270-
return NodeProperty(name=name, property_key=name)
280+
if name is None:
281+
raise ValueError(f"Node properties spec must be used with the dict syntax: {spec}")
271282

272-
if isinstance(spec, dict):
273-
return NodeProperty(name=name, property_key=name, **spec)
283+
return NodeProperty(name=name, property_key=name)
274284

275285
raise TypeError(f"Invalid node property specification: {spec}")
276286

graphdatascience/tests/unit/test_graph_cypher.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,11 @@ def test_multiple_multi_graph(runner: CollectingQueryRunner, gds: GraphDataScien
220220

221221
@pytest.mark.parametrize("server_version", [ServerVersion(2, 4, 0)])
222222
def test_node_properties(runner: CollectingQueryRunner, gds: GraphDataScience) -> None:
223+
# G, _ = gds.graph.cypher.project(
224+
# "g", nodes=dict(L1=["prop1"], L2=["prop2", "prop3"], L3=dict(prop4=True, prop5=dict()))
225+
# )
223226
G, _ = gds.graph.cypher.project(
224-
"g", nodes=dict(L1=["prop1"], L2=["prop2", "prop3"], L3=dict(prop4=True, prop5=dict()))
227+
"g", nodes={"L1": ["prop1"], "L2": ["prop2", "prop3"], "L3": {"prop4": True, "prop5": {}}}
225228
)
226229

227230
assert G.name() == "g"
@@ -247,3 +250,26 @@ def test_node_properties(runner: CollectingQueryRunner, gds: GraphDataScience) -
247250
"sourceNodeProperties: sourceNodeProperties, "
248251
"targetNodeProperties: targetNodeProperties})"
249252
)
253+
254+
255+
@pytest.mark.skip(reason="Not implemented yet")
256+
@pytest.mark.parametrize("server_version", [ServerVersion(2, 4, 0)])
257+
def test_node_properties_alias(runner: CollectingQueryRunner, gds: GraphDataScience) -> None:
258+
G, _ = gds.graph.cypher.project(
259+
"g", nodes=dict(A=dict(target_prop1="source_prop1", target_prop2=dict(property_key="source_prop2")))
260+
)
261+
262+
assert G.name() == "g"
263+
assert runner.last_params() == dict(graph_name="g")
264+
265+
assert runner.last_query() == (
266+
"""MATCH (source:A)-->(target:A)
267+
WITH source, target, """
268+
"[{target_prop1: source.source_prop1, target_prop1: source.source_prop2}] AS sourceNodeProperties"
269+
"""[{target_prop1: target.source_prop1, target_prop1: target.source_prop2}] AS targetNodeProperties
270+
RETURN gds.graph.project($graph_name, source, target, {"""
271+
"sourceNodeLabels: labels(source), "
272+
"targetNodeLabels: labels(target), "
273+
"sourceNodeProperties: sourceNodeProperties, "
274+
"targetNodeProperties: targetNodeProperties})"
275+
)

0 commit comments

Comments
 (0)