linkml-store 0.2.10rc1__tar.gz → 0.2.11__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.

Potentially problematic release.


This version of linkml-store might be problematic. Click here for more details.

Files changed (85) hide show
  1. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/PKG-INFO +4 -1
  2. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/pyproject.toml +4 -1
  3. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/cli.py +21 -2
  4. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/format_utils.py +21 -13
  5. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/LICENSE +0 -0
  6. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/README.md +0 -0
  7. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/__init__.py +0 -0
  8. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/__init__.py +0 -0
  9. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/client.py +0 -0
  10. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/collection.py +0 -0
  11. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/config.py +0 -0
  12. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/database.py +0 -0
  13. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/queries.py +0 -0
  14. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/__init__.py +0 -0
  15. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/chromadb/__init__.py +0 -0
  16. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/chromadb/chromadb_collection.py +0 -0
  17. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/chromadb/chromadb_database.py +0 -0
  18. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/duckdb/__init__.py +0 -0
  19. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/duckdb/duckdb_collection.py +0 -0
  20. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/duckdb/duckdb_database.py +0 -0
  21. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/duckdb/mappings.py +0 -0
  22. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/filesystem/__init__.py +0 -0
  23. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/filesystem/filesystem_collection.py +0 -0
  24. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/filesystem/filesystem_database.py +0 -0
  25. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/hdf5/__init__.py +0 -0
  26. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/hdf5/hdf5_collection.py +0 -0
  27. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/hdf5/hdf5_database.py +0 -0
  28. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/mongodb/__init__.py +0 -0
  29. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/mongodb/mongodb_collection.py +0 -0
  30. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/mongodb/mongodb_database.py +0 -0
  31. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/neo4j/__init__.py +0 -0
  32. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/neo4j/neo4j_collection.py +0 -0
  33. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/neo4j/neo4j_database.py +0 -0
  34. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/solr/__init__.py +0 -0
  35. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/solr/solr_collection.py +0 -0
  36. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/solr/solr_database.py +0 -0
  37. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/stores/solr/solr_utils.py +0 -0
  38. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/api/types.py +0 -0
  39. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/constants.py +0 -0
  40. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/graphs/__init__.py +0 -0
  41. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/graphs/graph_map.py +0 -0
  42. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/index/__init__.py +0 -0
  43. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/index/implementations/__init__.py +0 -0
  44. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/index/implementations/llm_indexer.py +0 -0
  45. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/index/implementations/simple_indexer.py +0 -0
  46. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/index/indexer.py +0 -0
  47. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/__init__.py +0 -0
  48. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/evaluation.py +0 -0
  49. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/implementations/__init__.py +0 -0
  50. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/implementations/llm_inference_engine.py +0 -0
  51. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/implementations/rag_inference_engine.py +0 -0
  52. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/implementations/rule_based_inference_engine.py +0 -0
  53. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/implementations/sklearn_inference_engine.py +0 -0
  54. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/inference_config.py +0 -0
  55. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/inference_engine.py +0 -0
  56. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/inference/inference_engine_registry.py +0 -0
  57. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/plotting/__init__.py +0 -0
  58. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/plotting/cli.py +0 -0
  59. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/plotting/heatmap.py +0 -0
  60. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/__init__.py +0 -0
  61. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/change_utils.py +0 -0
  62. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/dat_parser.py +0 -0
  63. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/enrichment_analyzer.py +0 -0
  64. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/file_utils.py +0 -0
  65. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/io.py +0 -0
  66. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/llm_utils.py +0 -0
  67. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/mongodb_utils.py +0 -0
  68. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/neo4j_utils.py +0 -0
  69. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/object_utils.py +0 -0
  70. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/pandas_utils.py +0 -0
  71. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/patch_utils.py +0 -0
  72. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/query_utils.py +0 -0
  73. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/schema_utils.py +0 -0
  74. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/sklearn_utils.py +0 -0
  75. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/sql_utils.py +0 -0
  76. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/stats_utils.py +0 -0
  77. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/utils/vector_utils.py +0 -0
  78. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/__init__.py +0 -0
  79. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/html/__init__.py +0 -0
  80. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/html/base.html.j2 +0 -0
  81. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/html/collection_details.html.j2 +0 -0
  82. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/html/database_details.html.j2 +0 -0
  83. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/html/databases.html.j2 +0 -0
  84. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/html/generic.html.j2 +0 -0
  85. {linkml_store-0.2.10rc1 → linkml_store-0.2.11}/src/linkml_store/webapi/main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: linkml-store
3
- Version: 0.2.10rc1
3
+ Version: 0.2.11
4
4
  Summary: linkml-store
5
5
  License: MIT
6
6
  Author: Author 1
@@ -24,6 +24,7 @@ Provides-Extra: map
24
24
  Provides-Extra: mongodb
25
25
  Provides-Extra: neo4j
26
26
  Provides-Extra: pyarrow
27
+ Provides-Extra: pyreadr
27
28
  Provides-Extra: rdf
28
29
  Provides-Extra: renderer
29
30
  Provides-Extra: scipy
@@ -40,6 +41,7 @@ Requires-Dist: h5py ; extra == "h5py"
40
41
  Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
41
42
  Requires-Dist: jsonlines (>=4.0.0,<5.0.0)
42
43
  Requires-Dist: jsonpatch (>=1.33)
44
+ Requires-Dist: jsonpath-ng
43
45
  Requires-Dist: lightrdf ; extra == "rdf"
44
46
  Requires-Dist: linkml (>=1.8.0) ; extra == "validation"
45
47
  Requires-Dist: linkml-runtime (>=1.8.0)
@@ -56,6 +58,7 @@ Requires-Dist: py2neo ; extra == "neo4j"
56
58
  Requires-Dist: pyarrow ; extra == "pyarrow"
57
59
  Requires-Dist: pydantic (>=2.0.0,<3.0.0)
58
60
  Requires-Dist: pymongo (>=4.11,<5.0) ; extra == "mongodb"
61
+ Requires-Dist: pyreadr ; extra == "pyreadr"
59
62
  Requires-Dist: pystow (>=0.5.4,<0.6.0)
60
63
  Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
61
64
  Requires-Dist: ruff (>=0.6.2) ; extra == "tests"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "linkml-store"
3
- version = "0.2.10rc1"
3
+ version = "0.2.11"
4
4
  description = "linkml-store"
5
5
  authors = ["Author 1 <author@org.org>"]
6
6
  license = "MIT"
@@ -31,6 +31,7 @@ py2neo = { version="*", optional = true }
31
31
  networkx = { version="*", optional = true }
32
32
  #chromadb = { version="*", optional = true }
33
33
  pyarrow = { version="*", optional = true }
34
+ pyreadr = { version="*", optional = true }
34
35
  h5py = { version="*", optional = true }
35
36
  scipy = { version="*", optional = true }
36
37
  scikit-learn = { version="*", optional = true }
@@ -49,6 +50,7 @@ fastapi = { version="*", optional = true }
49
50
  uvicorn = { version="*", optional = true }
50
51
  xmltodict = ">=0.13.0"
51
52
  jsonpatch = ">=1.33"
53
+ jsonpath-ng = "*"
52
54
  python-dotenv = "^1.0.1"
53
55
 
54
56
  [tool.poetry.group.dev.dependencies]
@@ -90,6 +92,7 @@ neo4j = ["neo4j", "py2neo", "networkx"]
90
92
  #chromadb = ["chromadb"]
91
93
  h5py = ["h5py"]
92
94
  pyarrow = ["pyarrow"]
95
+ pyreadr = ["pyreadr"]
93
96
  validation = ["linkml"]
94
97
  map = ["linkml_map"]
95
98
  renderer = ["linkml_renderer"]
@@ -25,6 +25,7 @@ from linkml_store.inference.inference_engine import ModelSerialization
25
25
  from linkml_store.utils.format_utils import Format, guess_format, load_objects, render_output, write_output
26
26
  from linkml_store.utils.object_utils import object_path_update
27
27
  from linkml_store.utils.pandas_utils import facet_summary_to_dataframe_unmelted
28
+ from linkml_store.plotting.cli import plot_cli
28
29
 
29
30
  DEFAULT_LOCAL_CONF_PATH = Path("linkml.yaml")
30
31
  # global path is ~/.linkml.yaml in the user's home directory
@@ -205,9 +206,10 @@ def drop(ctx):
205
206
  @click.option("--format", "-f", type=format_choice, help="Input format")
206
207
  @click.option("--object", "-i", multiple=True, help="Input object as YAML")
207
208
  @click.option("--source-field", help="If provided, inject file path source as this field")
209
+ @click.option("--glob-files/--no-glob-files", default=False, show_default=True, help="If true, use glob to find files")
208
210
  @json_select_query_option
209
211
  @click.pass_context
210
- def insert(ctx, files, replace, object, format, source_field, json_select_query):
212
+ def insert(ctx, files, glob_files, replace, object, format, source_field, json_select_query):
211
213
  """Insert objects from files (JSON, YAML, TSV) into the specified collection.
212
214
 
213
215
  Using a configuration:
@@ -216,6 +218,11 @@ def insert(ctx, files, replace, object, format, source_field, json_select_query)
216
218
 
217
219
  Note: if you don't provide a schema this will be inferred, but it is
218
220
  usually better to provide an explicit schema
221
+
222
+ You can use --glob-files if the list of files is too long
223
+
224
+ linkml-store -C config.yaml -c genes insert "data/genes/*.json" --glob-files
225
+
219
226
  """
220
227
  settings = ctx.obj["settings"]
221
228
  collection = settings.collection
@@ -226,7 +233,15 @@ def insert(ctx, files, replace, object, format, source_field, json_select_query)
226
233
  load_objects_args = {}
227
234
  if json_select_query:
228
235
  load_objects_args["select_query"] = json_select_query
236
+ if glob_files:
237
+ import glob
238
+ new_files = []
239
+ for file_path in files:
240
+ new_files.extend(glob.glob(file_path))
241
+ logger.info(f"Found {len(new_files)} files matching glob pattern {files}")
242
+ files = new_files
229
243
  for file_path in files:
244
+
230
245
  if format:
231
246
  objects = load_objects(file_path, format=format, **load_objects_args)
232
247
  else:
@@ -486,12 +501,14 @@ def fq(ctx, where, limit, columns, output_type, wide, output, **kwargs):
486
501
 
487
502
  Nested columns:
488
503
 
489
- linkml-store -d phenopackets fq subject.timeAtLastEncounter.age
504
+ linkml-store -d phenopackets fq -S subject.timeAtLastEncounter.age
490
505
 
491
506
  Compound keys:
492
507
 
493
508
  linkml-store -d phenopackets fq subject.sex+subject.timeAtLastEncounter.age
494
509
 
510
+ (TODO: compound keys do not work on solr)
511
+
495
512
  """
496
513
  collection = ctx.obj["settings"].collection
497
514
  where_clause = yaml.safe_load(where) if where else None
@@ -948,5 +965,7 @@ def validate(ctx, output_type, output, collection_only, **kwargs):
948
965
  click.echo(output_data)
949
966
 
950
967
 
968
+ cli.add_command(plot_cli, name="plot")
969
+
951
970
  if __name__ == "__main__":
952
971
  cli()
@@ -44,6 +44,7 @@ class Format(Enum):
44
44
  DAT = "dat"
45
45
  MARKDOWN = "markdown"
46
46
  PKL = "pkl"
47
+ RDS = "rds"
47
48
  PYTHON = "python"
48
49
  PARQUET = "parquet"
49
50
  HDF5 = "hdf5"
@@ -195,6 +196,9 @@ def process_file(
195
196
  objs = xmltodict.parse(f.read())
196
197
  elif format == Format.PKL:
197
198
  objs = pd.read_pickle(f).to_dict(orient="records")
199
+ elif format == Format.RDS:
200
+ import pyreadr
201
+ objs = pyreadr.read_r(f)
198
202
  elif format == Format.XLSX:
199
203
  xls = pd.ExcelFile(f)
200
204
  objs = {sheet: clean_nested_structure(xls.parse(sheet).to_dict(orient="records")) for sheet in xls.sheet_names}
@@ -349,21 +353,25 @@ def load_objects(
349
353
  all_objects = process_file(f, format, expected_type, header_comment_token)
350
354
 
351
355
  logger.debug(f"Loaded {len(all_objects)} objects from {file_path}")
352
- if select_query:
353
- import jsonpath_ng as jp
354
-
355
- path_expr = jp.parse(select_query)
356
- new_objs = []
357
- for obj in all_objects:
358
- for match in path_expr.find(obj):
359
- logging.debug(f"Match: {match.value}")
360
- if isinstance(match.value, list):
361
- new_objs.extend(match.value)
362
- else:
363
- new_objs.append(match.value)
364
- all_objects = new_objs
356
+ all_objects = transform_objects(all_objects, select_query)
365
357
  return all_objects
366
358
 
359
+ def transform_objects(all_objects: List[Dict[str, Any]], select_query: Optional[str]) -> List[Dict[str, Any]]:
360
+ if not select_query:
361
+ return all_objects
362
+ import jsonpath_ng as jp
363
+
364
+ path_expr = jp.parse(select_query)
365
+ new_objs = []
366
+ for obj in all_objects:
367
+ for match in path_expr.find(obj):
368
+ logging.debug(f"Match: {match.value}")
369
+ if isinstance(match.value, list):
370
+ new_objs.extend(match.value)
371
+ else:
372
+ new_objs.append(match.value)
373
+ all_objects = new_objs
374
+ return all_objects
367
375
 
368
376
  def write_output(
369
377
  data: Union[List[Dict[str, Any]], Dict[str, Any], pd.DataFrame],
File without changes