graphdatascience 1.15a2__tar.gz → 1.15.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. {graphdatascience-1.15a2/graphdatascience.egg-info → graphdatascience-1.15.1}/PKG-INFO +1 -1
  2. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/arrow_graph_constructor.py +7 -2
  3. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/arrow_query_runner.py +7 -0
  4. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/gds_arrow_client.py +4 -1
  5. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/neo4j_query_runner.py +38 -1
  6. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/protocol/project_protocols.py +16 -4
  7. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/query_runner.py +4 -0
  8. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/session_query_runner.py +15 -6
  9. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/standalone_session_query_runner.py +5 -0
  10. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/aura_api.py +1 -1
  11. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/session_sizes.py +1 -0
  12. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/version.py +1 -1
  13. {graphdatascience-1.15a2 → graphdatascience-1.15.1/graphdatascience.egg-info}/PKG-INFO +1 -1
  14. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/LICENSE +0 -0
  15. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/MANIFEST.in +0 -0
  16. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/README.md +0 -0
  17. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/__init__.py +0 -0
  18. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/algo/__init__.py +0 -0
  19. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/algo/algo_endpoints.py +0 -0
  20. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/algo/algo_proc_runner.py +0 -0
  21. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/algo/single_mode_algo_endpoints.py +0 -0
  22. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/call_builder.py +0 -0
  23. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/call_parameters.py +0 -0
  24. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/caller_base.py +0 -0
  25. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/endpoints.py +0 -0
  26. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/__init__.py +0 -0
  27. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/client_only_endpoint.py +0 -0
  28. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/cypher_warning_handler.py +0 -0
  29. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/endpoint_suggester.py +0 -0
  30. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/gds_not_installed.py +0 -0
  31. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/illegal_attr_checker.py +0 -0
  32. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/unable_to_connect.py +0 -0
  33. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/error/uncallable_namespace.py +0 -0
  34. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/__init__.py +0 -0
  35. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/base_graph_proc_runner.py +0 -0
  36. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_alpha_proc_runner.py +0 -0
  37. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_beta_proc_runner.py +0 -0
  38. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_create_result.py +0 -0
  39. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_cypher_runner.py +0 -0
  40. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_endpoints.py +0 -0
  41. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_entity_ops_runner.py +0 -0
  42. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_export_runner.py +0 -0
  43. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_object.py +0 -0
  44. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_proc_runner.py +0 -0
  45. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_project_runner.py +0 -0
  46. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_remote_proc_runner.py +0 -0
  47. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_remote_project_runner.py +0 -0
  48. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_sample_runner.py +0 -0
  49. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/graph_type_check.py +0 -0
  50. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/nx_loader.py +0 -0
  51. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph/ogb_loader.py +0 -0
  52. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/graph_data_science.py +0 -0
  53. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/ignored_server_endpoints.py +0 -0
  54. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/__init__.py +0 -0
  55. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/graphsage_model.py +0 -0
  56. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/link_prediction_model.py +0 -0
  57. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/model.py +0 -0
  58. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/model_alpha_proc_runner.py +0 -0
  59. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/model_beta_proc_runner.py +0 -0
  60. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/model_endpoints.py +0 -0
  61. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/model_proc_runner.py +0 -0
  62. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/model_resolver.py +0 -0
  63. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/node_classification_model.py +0 -0
  64. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/node_regression_model.py +0 -0
  65. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/pipeline_model.py +0 -0
  66. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/model/simple_rel_embedding_model.py +0 -0
  67. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/__init__.py +0 -0
  68. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/classification_training_pipeline.py +0 -0
  69. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/lp_pipeline_create_runner.py +0 -0
  70. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/lp_training_pipeline.py +0 -0
  71. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/nc_pipeline_create_runner.py +0 -0
  72. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/nc_training_pipeline.py +0 -0
  73. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/nr_pipeline_create_runner.py +0 -0
  74. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/nr_training_pipeline.py +0 -0
  75. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/pipeline_alpha_proc_runner.py +0 -0
  76. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/pipeline_beta_proc_runner.py +0 -0
  77. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/pipeline_endpoints.py +0 -0
  78. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/pipeline_proc_runner.py +0 -0
  79. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/pipeline/training_pipeline.py +0 -0
  80. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/py.typed +0 -0
  81. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/__init__.py +0 -0
  82. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/arrow_authentication.py +0 -0
  83. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/arrow_endpoint_version.py +0 -0
  84. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/arrow_info.py +0 -0
  85. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/cypher_graph_constructor.py +0 -0
  86. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/graph_constructor.py +0 -0
  87. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/progress/__init__.py +0 -0
  88. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/progress/progress_provider.py +0 -0
  89. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/progress/query_progress_logger.py +0 -0
  90. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/progress/query_progress_provider.py +0 -0
  91. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/progress/static_progress_provider.py +0 -0
  92. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/protocol/__init__.py +0 -0
  93. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/protocol/status.py +0 -0
  94. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/protocol/write_protocols.py +0 -0
  95. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/query_runner/termination_flag.py +0 -0
  96. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/__init__.py +0 -0
  97. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/cora/__init__.py +0 -0
  98. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/cora/cora_nodes.parquet.gzip +0 -0
  99. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/cora/cora_rels.parquet.gzip +0 -0
  100. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/cora/serialize_cora.py +0 -0
  101. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/__init__.py +0 -0
  102. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/imdb_acted_in.parquet.gzip +0 -0
  103. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/imdb_actors.parquet.gzip +0 -0
  104. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/imdb_directed_in.parquet.gzip +0 -0
  105. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/imdb_directors.parquet.gzip +0 -0
  106. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/imdb_movies_with_genre.parquet.gzip +0 -0
  107. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/imdb_movies_without_genre.parquet.gzip +0 -0
  108. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/imdb/serialize_imdb.py +0 -0
  109. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/karate/__init__.py +0 -0
  110. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/karate/karate_club.parquet.gzip +0 -0
  111. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/lastfm/__init__.py +0 -0
  112. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/lastfm/artist_nodes.parquet.gzip +0 -0
  113. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/lastfm/serialize_lastfm.py +0 -0
  114. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/lastfm/user_friend_df_directed.parquet.gzip +0 -0
  115. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/lastfm/user_listen_artist_rels.parquet.gzip +0 -0
  116. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/lastfm/user_nodes.parquet.gzip +0 -0
  117. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/resources/lastfm/user_tag_artist_rels.parquet.gzip +0 -0
  118. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/retry_utils/__init__.py +0 -0
  119. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/retry_utils/retry_config.py +0 -0
  120. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/retry_utils/retry_utils.py +0 -0
  121. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/semantic_version/__init__.py +0 -0
  122. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/semantic_version/semantic_version.py +0 -0
  123. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/server_version/__init__.py +0 -0
  124. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/server_version/compatible_with.py +0 -0
  125. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/server_version/server_version.py +0 -0
  126. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/__init__.py +0 -0
  127. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/algorithm_category.py +0 -0
  128. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/aura_api_responses.py +0 -0
  129. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/aura_api_token_authentication.py +0 -0
  130. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/aura_graph_data_science.py +0 -0
  131. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/aurads_sessions.py +0 -0
  132. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/cloud_location.py +0 -0
  133. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/dbms/__init__.py +0 -0
  134. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/dbms/protocol_resolver.py +0 -0
  135. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/dbms/protocol_version.py +0 -0
  136. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/dbms_connection_info.py +0 -0
  137. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/dedicated_sessions.py +0 -0
  138. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/gds_sessions.py +0 -0
  139. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/region_suggester.py +0 -0
  140. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/session/session_info.py +0 -0
  141. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/system/__init__.py +0 -0
  142. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/system/config_endpoints.py +0 -0
  143. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/system/system_endpoints.py +0 -0
  144. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/topological_lp/__init__.py +0 -0
  145. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/topological_lp/topological_lp_alpha_runner.py +0 -0
  146. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/topological_lp/topological_lp_endpoints.py +0 -0
  147. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/utils/__init__.py +0 -0
  148. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/utils/direct_util_endpoints.py +0 -0
  149. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/utils/util_node_property_func_runner.py +0 -0
  150. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/utils/util_proc_runner.py +0 -0
  151. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience/utils/util_remote_proc_runner.py +0 -0
  152. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience.egg-info/SOURCES.txt +0 -0
  153. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience.egg-info/dependency_links.txt +0 -0
  154. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience.egg-info/not-zip-safe +0 -0
  155. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience.egg-info/requires.txt +0 -0
  156. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/graphdatascience.egg-info/top_level.txt +0 -0
  157. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/pyproject.toml +0 -0
  158. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/requirements/base/base.txt +0 -0
  159. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/requirements/base/networkx.txt +0 -0
  160. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/requirements/base/ogb.txt +0 -0
  161. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/requirements/base/rust-ext.txt +0 -0
  162. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/setup.cfg +0 -0
  163. {graphdatascience-1.15a2 → graphdatascience-1.15.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphdatascience
3
- Version: 1.15a2
3
+ Version: 1.15.1
4
4
  Summary: A Python client for the Neo4j Graph Data Science (GDS) library
5
5
  Home-page: https://neo4j.com/product/graph-data-science/
6
6
  Author: Neo4j
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import concurrent
4
+ import logging
4
5
  import math
5
6
  import warnings
6
7
  from concurrent.futures import ThreadPoolExecutor
@@ -33,6 +34,7 @@ class ArrowGraphConstructor(GraphConstructor):
33
34
  )
34
35
  self._chunk_size = chunk_size
35
36
  self._min_batch_size = chunk_size * 10
37
+ self._logger = logging.getLogger()
36
38
 
37
39
  def run(self, node_dfs: list[DataFrame], relationship_dfs: list[DataFrame]) -> None:
38
40
  try:
@@ -60,8 +62,11 @@ class ArrowGraphConstructor(GraphConstructor):
60
62
 
61
63
  self._client.relationship_load_done(self._graph_name)
62
64
  except (Exception, KeyboardInterrupt) as e:
63
- self._client.abort(self._graph_name)
64
-
65
+ try:
66
+ self._client.abort(self._graph_name)
67
+ except Exception as abort_exception:
68
+ if "No arrow process" not in str(abort_exception):
69
+ self._logger.warning(f"error aborting graph creation: {abort_exception}")
65
70
  raise e
66
71
 
67
72
  def _partition_dfs(self, dfs: list[DataFrame]) -> list[DataFrame]:
@@ -211,6 +211,13 @@ class ArrowQueryRunner(QueryRunner):
211
211
  self._fallback_query_runner.close()
212
212
  self._gds_arrow_client.close()
213
213
 
214
+ def clone(self, host: str, port: int) -> "QueryRunner":
215
+ return ArrowQueryRunner(
216
+ self._gds_arrow_client,
217
+ self._fallback_query_runner.clone(host, port),
218
+ self._server_version,
219
+ )
220
+
214
221
  def fallback_query_runner(self) -> QueryRunner:
215
222
  return self._fallback_query_runner
216
223
 
@@ -640,7 +640,10 @@ class GdsArrowClient:
640
640
  )
641
641
  def send_with_retry() -> dict[str, Any]:
642
642
  try:
643
- result = client.do_action(flight.Action(action_type, json.dumps(meta_data).encode("utf-8")))
643
+ result = client.do_action(
644
+ action=flight.Action(action_type, json.dumps(meta_data).encode("utf-8")),
645
+ options=flight.FlightCallOptions(timeout=20.0),
646
+ )
644
647
 
645
648
  # Consume result fully to sanity check and avoid cancelled streams
646
649
  collected_result = list(result)
@@ -46,6 +46,8 @@ class Neo4jQueryRunner(QueryRunner):
46
46
 
47
47
  query_runner = Neo4jQueryRunner(
48
48
  driver,
49
+ Neo4jQueryRunner.parse_protocol(endpoint),
50
+ auth,
49
51
  auto_close=True,
50
52
  bookmarks=bookmarks,
51
53
  config=config,
@@ -54,8 +56,14 @@ class Neo4jQueryRunner(QueryRunner):
54
56
  )
55
57
 
56
58
  elif isinstance(endpoint, neo4j.Driver):
59
+ protocol = "neo4j+s" if endpoint.encrypted else "bolt"
57
60
  query_runner = Neo4jQueryRunner(
58
- endpoint, auto_close=False, bookmarks=bookmarks, database=database, show_progress=show_progress
61
+ endpoint,
62
+ protocol,
63
+ auto_close=False,
64
+ bookmarks=bookmarks,
65
+ database=database,
66
+ show_progress=show_progress,
59
67
  )
60
68
  else:
61
69
  raise ValueError(f"Invalid endpoint type: {type(endpoint)}")
@@ -76,6 +84,8 @@ class Neo4jQueryRunner(QueryRunner):
76
84
 
77
85
  query_runner = Neo4jQueryRunner(
78
86
  driver,
87
+ Neo4jQueryRunner.parse_protocol(endpoint),
88
+ auth,
79
89
  auto_close=True,
80
90
  show_progress=show_progress,
81
91
  bookmarks=None,
@@ -94,9 +104,18 @@ class Neo4jQueryRunner(QueryRunner):
94
104
  config["keep_alive"] = True
95
105
  config["max_connection_pool_size"] = 50
96
106
 
107
+ @staticmethod
108
+ def parse_protocol(endpoint: str) -> str:
109
+ protocol_match = re.match(r"^([^:]+)://", endpoint)
110
+ if not protocol_match:
111
+ raise ValueError(f"Invalid endpoint URI format: {endpoint}")
112
+ return protocol_match.group(1)
113
+
97
114
  def __init__(
98
115
  self,
99
116
  driver: neo4j.Driver,
117
+ protocol: str,
118
+ auth: Optional[tuple[str, str]] = None,
100
119
  config: dict[str, Any] = {},
101
120
  database: Optional[str] = neo4j.DEFAULT_DATABASE,
102
121
  auto_close: bool = False,
@@ -105,6 +124,8 @@ class Neo4jQueryRunner(QueryRunner):
105
124
  instance_description: str = "Neo4j DBMS",
106
125
  ):
107
126
  self._driver = driver
127
+ self._protocol = protocol
128
+ self._auth = auth
108
129
  self._config = config
109
130
  self._auto_close = auto_close
110
131
  self._database = database
@@ -279,6 +300,22 @@ class Neo4jQueryRunner(QueryRunner):
279
300
  def set_show_progress(self, show_progress: bool) -> None:
280
301
  self._show_progress = show_progress
281
302
 
303
+ def clone(self, host: str, port: int) -> QueryRunner:
304
+ endpoint = "{}://{}:{}".format(self._protocol, host, port)
305
+ driver = neo4j.GraphDatabase.driver(endpoint, auth=self._auth, **self.driver_config())
306
+
307
+ return Neo4jQueryRunner(
308
+ driver,
309
+ self._protocol,
310
+ self._auth,
311
+ self._config,
312
+ self._database,
313
+ self._auto_close,
314
+ self._bookmarks,
315
+ self._show_progress,
316
+ self._instance_description,
317
+ )
318
+
282
319
  @staticmethod
283
320
  def handle_driver_exception(session: neo4j.Session, e: Exception) -> None:
284
321
  reg_gds_hit = re.search(
@@ -121,7 +121,7 @@ class ProjectProtocolV3(ProjectProtocol):
121
121
  query_runner: QueryRunner,
122
122
  endpoint: str,
123
123
  params: CallParameters,
124
- terminationFlag: TerminationFlag,
124
+ termination_flag: TerminationFlag,
125
125
  yields: Optional[list[str]] = None,
126
126
  database: Optional[str] = None,
127
127
  logging: bool = False,
@@ -132,6 +132,14 @@ class ProjectProtocolV3(ProjectProtocol):
132
132
 
133
133
  logger = getLogger()
134
134
 
135
+ # We need to pin the driver to a specific cluster member
136
+ response = query_runner.call_procedure(
137
+ ProtocolVersion.V3.versioned_procedure_name(endpoint), params, yields, database, logging, False
138
+ ).squeeze()
139
+ member_host = response["host"]
140
+ member_port = response["port"] if ("port" in response.index) else 7687
141
+ projection_query_runner = query_runner.clone(member_host, member_port)
142
+
135
143
  @retry(
136
144
  reraise=True,
137
145
  before=before_log(f"Projection (graph: `{params['graph_name']}`)", logger, DEBUG),
@@ -139,9 +147,13 @@ class ProjectProtocolV3(ProjectProtocol):
139
147
  wait=wait_incrementing(start=0.2, increment=0.2, max=2),
140
148
  )
141
149
  def project_fn() -> DataFrame:
142
- terminationFlag.assert_running()
143
- return query_runner.call_procedure(
150
+ termination_flag.assert_running()
151
+ return projection_query_runner.call_procedure(
144
152
  ProtocolVersion.V3.versioned_procedure_name(endpoint), params, yields, database, logging, False
145
153
  )
146
154
 
147
- return project_fn()
155
+ projection_result = project_fn()
156
+
157
+ projection_query_runner.close()
158
+
159
+ return projection_result
@@ -80,5 +80,9 @@ class QueryRunner(ABC):
80
80
  def set_show_progress(self, show_progress: bool) -> None:
81
81
  pass
82
82
 
83
+ @abstractmethod
84
+ def clone(self, host: str, port: int) -> "QueryRunner":
85
+ pass
86
+
83
87
  def set_server_version(self, _: ServerVersion) -> None:
84
88
  pass
@@ -120,6 +120,14 @@ class SessionQueryRunner(QueryRunner):
120
120
  self._show_progress = show_progress
121
121
  self._gds_query_runner.set_show_progress(show_progress)
122
122
 
123
+ def clone(self, host: str, port: int) -> QueryRunner:
124
+ return SessionQueryRunner(
125
+ self._gds_query_runner,
126
+ self._db_query_runner.clone(host, port),
127
+ self._gds_arrow_client,
128
+ self._show_progress,
129
+ )
130
+
123
131
  def close(self) -> None:
124
132
  self._gds_arrow_client.close()
125
133
  self._gds_query_runner.close()
@@ -202,12 +210,13 @@ class SessionQueryRunner(QueryRunner):
202
210
  return write_protocol.run_write_back(self._db_query_runner, write_back_params, yields, terminationFlag)
203
211
 
204
212
  try:
205
- if self._resolve_show_progress(logging):
206
- database_write_result = self._progress_logger.run_with_progress_logging(
207
- run_write_back, job_id, database
208
- )
209
- else:
210
- database_write_result = run_write_back()
213
+ # Skipping progress for now as export has a different jobId
214
+ # if self._resolve_show_progress(logging):
215
+ # database_write_result = self._progress_logger.run_with_progress_logging(
216
+ # run_write_back, job_id, database
217
+ # )
218
+ # else:
219
+ database_write_result = run_write_back()
211
220
  except Exception as e:
212
221
  # catch the case nothing was needed to write-back (empty graph)
213
222
  # once we have the Arrow Endpoints V2, we could catch by first checking the jobs summary
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from typing import Any, Optional
2
4
 
3
5
  from pandas import DataFrame
@@ -74,3 +76,6 @@ class StandaloneSessionQueryRunner(QueryRunner):
74
76
 
75
77
  def set_server_version(self, _: ServerVersion) -> None:
76
78
  super().set_server_version(_)
79
+
80
+ def clone(self, host: str, port: int) -> QueryRunner:
81
+ return self
@@ -352,7 +352,7 @@ class AuraApi:
352
352
  def _check_status_code(self, resp: requests.Response) -> None:
353
353
  if resp.status_code >= 400:
354
354
  raise AuraApiError(
355
- f"Request for {resp.url} failed with status code {resp.status_code} - {resp.reason}: {resp.text}",
355
+ f"Request for {resp.url} failed with status code {resp.status_code} - {resp.reason}: {resp.json()}",
356
356
  status_code=resp.status_code,
357
357
  )
358
358
 
@@ -57,6 +57,7 @@ class SessionMemory(Enum):
57
57
  m_192GB = SessionMemoryValue("192GB")
58
58
  m_256GB = SessionMemoryValue("256GB")
59
59
  m_384GB = SessionMemoryValue("384GB")
60
+ m_512GB = SessionMemoryValue("512GB")
60
61
 
61
62
  @classmethod
62
63
  def all_values(cls) -> list[SessionMemoryValue]:
@@ -1,2 +1,2 @@
1
- __version__ = "1.15a2"
1
+ __version__ = "1.15.1"
2
2
  __min_server_version__ = "2.6.0" # matches installation.adoc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphdatascience
3
- Version: 1.15a2
3
+ Version: 1.15.1
4
4
  Summary: A Python client for the Neo4j Graph Data Science (GDS) library
5
5
  Home-page: https://neo4j.com/product/graph-data-science/
6
6
  Author: Neo4j