Skip to content

Commit

Permalink
Merge pull request #651 from usc-isi-i2/dev
Browse files Browse the repository at this point in the history
Release 1.4.2
  • Loading branch information
saggu authored May 12, 2022
2 parents b62c2e3 + 6cfaccc commit 2489050
Show file tree
Hide file tree
Showing 85 changed files with 1,926 additions and 633 deletions.
525 changes: 330 additions & 195 deletions docs/analysis/visualize-graph.md

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions docs/configure-kgtk-notebooks-readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,3 +195,25 @@ kgtk query --graph-cache /data/amandeep/wikidata-20211027-dwd-v3/useful-files/te
Notice the files are loaded with an alias, `"/data/amandeep/wikidata-20211027-dwd-v3/claims.tsv.gz" --as claims`.

At this step, the notebook setup is complete with set environment variables.

## Print a List of KGTK File names

Call this function to print a list of all file nicknames and corresponding
files or a subset of file nicknames.
```
ck.print_kgtk_file_names(file_names=None)
```

The variable `file_names` can be a `str` of a `List[str]`, if its `None`, the
function will print all known file nick names and corresponding KGTK file.

```
ck.print_kgtk_file_names(file_names=['isa', 'p279star', 'claims'])
isa: derived.isa.tsv.gz
p279star: derived.P279star.tsv.gz
claims: claims.tsv.gz
```

**Note: This function will only print file names, the files are not required to be
in the input folder.**
Binary file removed docs/images/visualize-force-graph-examples/10.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/11.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/11.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/visualize-force-graph-examples/12.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/visualize-force-graph-examples/13.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/visualize-force-graph-examples/15.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/visualize-force-graph-examples/16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/2.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/3.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/4.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/5.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/6.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/7.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/8.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/images/visualize-force-graph-examples/9.jpg
Binary file not shown.
Binary file added docs/images/visualize-force-graph-examples/9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 3 additions & 1 deletion docs/transform/query.md
Original file line number Diff line number Diff line change
Expand Up @@ -2170,7 +2170,9 @@ TO DO

| Function | Description |
|-----------------------|--------------------------------------------------------------------------------------------|
| kgtk_literal(x) | Return True if 'x' is any KGTK literal. This assumes valid literals and only tests the first character (except for booleans). |
| kgtk_literal(x) | Return True if `x` is any KGTK literal. This assumes valid literals and only tests the first character (except for booleans). |
| kgtk_symbol(x) | Return True if `x` is a KGTK symbol. This assumes valid literals and only tests the first character (except for booleans). |
| kgtk_type(x) | Return a type for the KGTK literal or symbol `x`, which will be one of `string`, `lq_string`, `date_time`, `quantity`, `geo_coord`, `boolean`, `typed_literal` or `symbol`. This assumes valid literals and only tests the first character (except for booleans). |
| kgtk_regex(x, regex) | Regex matcher that implements the Cypher `=~` semantics which must match the whole string. |
| kgtk_null_to_empty(x) | If `x` is NULL map it onto the empty string, otherwise return `x` unmodified. |
| kgtk_empty_to_null(x) | If `x` is the empty string, map it onto NULL, otherwise return `x` unmodified. |
Expand Down
38 changes: 19 additions & 19 deletions examples/docs/visualize_force_graph_example2.tsv
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
node1 label node2 weight hex_color
Q1 "friend" Q2 0.9 #FF69B4
Q2 "friend" Q3 0.3 #FF69B4
Q3 "friend" Q4 "" #FF69B4
Q5 "friend" Q3 "" #FF69B4
Q6 "friend" Q5 "" #FF69B4
Q6 "friend" Q1 "" #FF69B4
Q1 "born" Q7 "" #FFF68F
Q2 "born" Q7 "" #FFF68F
Q3 "born" Q7 "" #FFF68F
Q4 "born" Q8 "" #FFF68F
Q5 "born" Q8 "" #FFF68F
Q6 "born" Q8 "" #FFF68F
Q1 "lives" Q8 "" #32CD32
Q2 "lives" Q7 "" #32CD32
Q3 "lives" Q9 "" #32CD32
Q4 "lives" Q8 "" #32CD32
Q5 "lives" Q9 "" #32CD32
Q6 "lives" Q8 "" #32CD32
node1 label node2 weight hex_color ordinal
Q1 "friend" Q2 0.9 #FF69B4 0
Q2 "friend" Q3 0.3 #FF69B4 1
Q3 "friend" Q4 "" #FF69B4 2
Q5 "friend" Q3 "" #FF69B4 3
Q6 "friend" Q5 "" #FF69B4 4
Q6 "friend" Q1 "" #FF69B4 5
Q1 "born" Q7 "" #FFF68F 6
Q2 "born" Q7 "" #FFF68F 7
Q3 "born" Q7 "" #FFF68F 8
Q4 "born" Q8 "" #FFF68F 9
Q5 "born" Q8 "" #FFF68F 10
Q6 "born" Q8 "" #FFF68F 11
Q1 "lives" Q8 "" #32CD32 12
Q2 "lives" Q7 "" #32CD32 13
Q3 "lives" Q9 "" #32CD32 14
Q4 "lives" Q8 "" #32CD32 15
Q5 "lives" Q9 "" #32CD32 16
Q6 "lives" Q8 "" #32CD32 17
20 changes: 10 additions & 10 deletions examples/docs/visualize_force_graph_example2_node.tsv
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
id label is_country type degree type_missing population hex_color
Q1 'Alice'@en 0 human 40 "" "" #00FFFF
Q2 'Susan'@en 0 human 14 "" "" #8A2BE2
Q3 'John'@en 0 human 4 "" "" #FF4040
Q4 'Claudia'@en 0 human 32 "" "" #7FFF00
Q5 'Ulrich'@en 0 human 422 "" "" #FFB90F
Q6 'Fritz'@en 0 human 4 "" "" #C1FFC1
Q7 'USA'@en 1 country 50 country 300 #FF1493
Q8 'Germany'@en 1 country 500 country 50 #FFD700
Q9 'Brazil'@en 1 country 222 country 200 #FF69B4
id label is_country type degree type_missing population hex_color ordinal
Q1 'Alice'@en 0 human 40 "" "" #00FFFF 0
Q2 'Susan'@en 0 human 14 "" "" #8A2BE2 1
Q3 'John'@en 0 human 4 "" "" #FF4040 2
Q4 'Claudia'@en 0 human 32 "" "" #7FFF00 3
Q5 'Ulrich'@en 0 human 422 "" "" #FFB90F 4
Q6 'Fritz'@en 0 human 4 "" "" #C1FFC1 5
Q7 'USA'@en 1 country 50 country 300 #FF1493 6
Q8 'Germany'@en 1 country 500 country 50 #FFD700 7
Q9 'Brazil'@en 1 country 222 country 200 #FF69B4 8
11 changes: 7 additions & 4 deletions kgtk-properties/kgtk.properties.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -78,17 +78,19 @@ P279dwdstar P31 Q18616576 P279dwdstar-P31-Q18616576
P279dwdstar P31 Q28326461 P279dwdstar-P31-Q28326461
P279dwdstar P31 Q18647519 P279dwdstar-P31-Q18647519
P279dwdstar datatype wikibase-item P279dwdstar-datatype-643cc9
P1963computed label 'properties for this type (computed)'@en P1963computed-label-69d08f
P1963computed label 'properties for this type'@en P1963computed-label-69d08f
P1963computed description 'The properties defined for a class, computed based on its instances'@en P1963computed-description-2e5ab8
P1963computed P31 Q19820110 P1963computed-P31-Q19820110
P1963computed P279 Q22582645 P1963computed-P279-Q22582645
P1963computed P1659 P1963 P1963computed-P1659-P1963
P1963computed P7482 Q108739856 P1963computed-P7482-Q108739856
P1963computed datatype quantity P1963computed-datatype-1a7b30
Pproperty_domain label 'entity types used (computed)'@en Pproperty_domain-label-4ffb8a
Pproperty_domain description 'List the classes that appear as values of a property'@en Pproperty_domain-description-7eb869
Pproperty_domain P31 Q19820110 Pproperty_domain-P31-Q19820110
Pproperty_domain P279 Q22582645 Pproperty_domain-P279-Q22582645
Pproperty_domain P1659 P1963 Pproperty_domain-P1659-P1963
Pproperty_domain P7482 Q108739856 Pproperty_domain-P7482-Q108739856
Pproperty_domain datatype wikibase-item Pproperty_domain-datatype-643cc9
Pproperty_units_used label 'units used (computed)'@en Pproperty_units_used-label-9b6df6
Pproperty_units_used description 'The units used in quantity properties'@en Pproperty_units_used-description-8cb3de
Expand Down Expand Up @@ -119,11 +121,11 @@ P131country P31 Q18647519 P131country-P31-Q18647519
P131country P31 Q18647515 P131country-P31-Q18647515
P131country P31 Q18615777 P131country-P31-Q18615777
P131country P31 Q70564278 P131country-P31-Q70564278
Pinstance_count label 'number of instances of a class (computed)'@en Pinstance_count-label-a6705f
Pinstance_count label '# instances'@en Pinstance_count-label-a6705f
Pinstance_count description 'The number of P31/P31x instances of a class'@en Pinstance_count-description-b06abb
Pinstance_count P31 Q18616576 Pinstance_count-P31-Q18616576
Pinstance_count datatype quantity Pinstance_count-datatype-1a7b30
Pinstance_count_star label 'number of instances of a class and its subclasses (computed)'@en Pinstance_count_star-label-c48ebd
Pinstance_count_star label '# instances including subclasses'@en Pinstance_count_star-label-c48ebd
Pinstance_count_star description 'The number of P31/P31x instances of a class and its subclasses'@en Pinstance_count_star-description-bceb9a
Pinstance_count_star P31 Q18616576 Pinstance_count_star-P31-Q18616576
Pinstance_count_star datatype quantity Pinstance_count_star-datatype-1a7b30
Expand All @@ -135,9 +137,10 @@ Pshort_abstract label 'short abstract from Wikipedia articles'@en Pshort_abstrac
Pshort_abstract description 'text before the table of contents from Wikipedia articles shortened to 2-3 sentences'@en Pshort_abstract-description-d251e5
Pshort_abstract P31 Q18616576 Pshort_abstract-P31-Q18616576
Pshort_abstract datatype string Pshort_abstract-datatype-473287
P1963computed_star label 'properties for this type and its subclasses(computed)'@en P1963computed_star-label-69d08f
P1963computed_star label 'properties for this type including subclasses'@en P1963computed_star-label-69d08f
P1963computed_star description 'The properties defined for a class, computed based on its instances and instances of all subclasses'@en P1963computed_star-description-229afc
P1963computed_star P31 Q19820110 P1963computed_star-P31-Q19820110
P1963computed_star P279 Q22582645 P1963computed_star-P279-Q22582645
P1963computed_star P1659 P1963 P1963computed_star-P1659-P1963
P1963computed_star P7482 Q108739856 P1963computed_star-P7482-Q108739856
P1963computed_star datatype quantity P1963computed_star-datatype-1a7b30
2 changes: 1 addition & 1 deletion kgtk/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '1.4.1'
__version__ = '1.4.2'
95 changes: 39 additions & 56 deletions kgtk/cli/visualize-graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
from kgtk.cli_argparse import KGTKArgumentParser, KGTKFiles
from kgtk.io.kgtkreader import KgtkReader, KgtkReaderOptions
from kgtk.value.kgtkvalueoptions import KgtkValueOptions
from kgtk.utils.color_styles import color_style_dict, CATEGORICAL, GRADIENT

gradient_color_styles = ', '.join([k for k, v in color_style_dict.items() if v['style'] == GRADIENT])
categorical_color_styles = ', '.join([k for k, v in color_style_dict.items() if v['style'] == CATEGORICAL])


def parser():
Expand Down Expand Up @@ -57,9 +61,12 @@ def add_arguments_extended(parser: KGTKArgumentParser, parsed_shared_args: Names

parser.add_argument('--edge-color-numbers',
dest='edge_color_numbers',
action='store_true',
default=False,
help="Add this option if the values in the --edge-color-column are numbers")
type=str,
default=None,
help="Indicate if the values in the --edge-color-column are numbers and specify how to "
"scale the numbers. The valid choices are:linear|log|as-is. "
"Default: None. "
"The numbers will be scaled linearly, logarithmically, left as is respectively.")

parser.add_argument('--edge-color-hex',
dest='edge_color_hex',
Expand All @@ -71,8 +78,11 @@ def add_arguments_extended(parser: KGTKArgumentParser, parsed_shared_args: Names
parser.add_argument('--edge-color-style',
dest='edge_color_style',
type=str,
default=None,
help="Edge color style for edge color: categorical|gradient. Default: None")
default='d3.interpolateRainbow',
help=f"Pick one of the following CATEGORICAL styles: \n{categorical_color_styles}\n"
f"OR one of the following GRADIENT styles: \n{gradient_color_styles}\n"
f"Default: d3.interpolateRainbow."
f"See https://github.com/d3/d3-scale-chromatic for more details.")

parser.add_argument('--edge-color-default',
dest='edge_color_default',
Expand Down Expand Up @@ -120,26 +130,26 @@ def add_arguments_extended(parser: KGTKArgumentParser, parsed_shared_args: Names
parser.add_argument('--node-color-style',
dest='node_color_style',
type=str,
default=None,
help="Node color style: categorical|gradient. Default: None")
default='d3.interpolateRainbow',
help=f"Pick one of the following CATEGORICAL styles: \n{categorical_color_styles}\n"
f"OR one of the following GRADIENT styles: \n{gradient_color_styles}\n"
f"Default: d3.interpolateRainbow."
f"See https://github.com/d3/d3-scale-chromatic for more details.")

parser.add_argument('--node-color-default',
dest='node_color_default',
type=str,
default='#000000',
help="Default node color. Default: '#000000'")

parser.add_argument('--node-color-scale',
dest='node_color_scale',
type=str,
default=None,
help="Node color scale: linear|log. Default: None")

parser.add_argument('--node-color-numbers',
dest='node_color_numbers',
action='store_true',
default=False,
help="Add this option if the values in the --node-color-column are numbers")
type=str,
default=None,
help="Indicate if the values in the --node-color-column are numbers and specify how to "
"scale the numbers. The valid choices are:linear|log|as-is. "
"Default: None. "
"The numbers will be scaled linearly, logarithmically, left as is respectively.")

parser.add_argument('--node-color-hex',
dest='node_color_hex',
Expand Down Expand Up @@ -212,32 +222,6 @@ def add_arguments_extended(parser: KGTKArgumentParser, parsed_shared_args: Names
"--show-text-limit option, which is 500 by default, "
"then the text will not be shown in the visualization.")

parser.add_argument('--node-categorical-scale',
dest='node_categorical_scale',
type=str,
default='rainbow',
help="Node color categorical scale node from d3-scale-chromatic."
"https://observablehq.com/@d3/sequential-scales. Default: rainbow")

parser.add_argument('--edge-categorical-scale',
dest='edge_categorical_scale',
type=str,
default='rainbow',
help="Edge color categorical scale for edge d3-scale-chromatic."
"https://observablehq.com/@d3/sequential-scales. Default: rainbow")

parser.add_argument('--node-gradient-scale',
dest='node_gradient_scale',
type=str,
default='d3.interpolateRdBu',
help="Node color gradient scale from d3-scale-chromatic. Default: d3.interpolateRdBu")

parser.add_argument('--edge-gradient-scale',
dest='edge_gradient_scale',
type=str,
default='d3.interpolateRdBu',
help="Edge color gradient scale from d3-scale-chromatic. Default: d3.interpolateRdBu")

parser.add_argument('--show-blank-labels',
dest='show_blank_labels',
action='store_true',
Expand All @@ -262,20 +246,19 @@ def run(input_file: KGTKFiles,
edge_label: bool = False,
edge_color_column: str = None,
edge_color_hex: bool = False,
edge_color_numbers: bool = False,
edge_color_style: str = None,
edge_color_numbers: str = None,
edge_color_style: str = 'd3.interpolateRainbow',
edge_color_default: str = '#000000',
edge_width_column: str = None,
edge_width_default: float = 1.0,
edge_width_minimum: float = 1.0,
edge_width_maximum: float = 5.0,
edge_width_scale: str = None,
node_color_column: str = None,
node_color_numbers: bool = False,
node_color_numbers: str = None,
node_color_hex: bool = False,
node_color_style: str = None,
node_color_style: str = 'd3.interpolateRainbow',
node_color_default: str = '#000000',
node_color_scale: str = None,
node_size_column: str = None,
node_size_default: float = 2.0,
node_size_minimum: float = 1.0,
Expand All @@ -286,13 +269,18 @@ def run(input_file: KGTKFiles,
node_border_color: str = None,
tooltip_column: str = None,
show_text: str = None,
node_categorical_scale: str = 'rainbow',
edge_categorical_scale: str = 'rainbow',
node_gradient_scale: str = 'd3.interpolateRdBu',
edge_gradient_scale: str = 'd3.interpolateRdBu',
show_blank_labels: bool = False,
**kwargs # Whatever KgtkFileOptions and KgtkValueOptions want.
) -> int:
from kgtk.exceptions import KGTKException
if node_color_style not in color_style_dict:
raise KGTKException(f'Unknown value: {node_color_style} for option: --node-color-style. Please choose'
f' one of the following: {", ".join(list(color_style_dict))}')

if edge_color_style not in color_style_dict:
raise KGTKException(f'Unknown value: {edge_color_style} for option: --edge-color-style. Please choose'
f' one of the following: {", ".join(list(color_style_dict))}')

from kgtk.visualize.visualize_api import KgtkVisualize
kv: KgtkVisualize = KgtkVisualize(
input_file=input_file,
Expand Down Expand Up @@ -320,7 +308,6 @@ def run(input_file: KGTKFiles,
node_color_numbers=node_color_numbers,
node_color_style=node_color_style,
node_color_default=node_color_default,
node_color_scale=node_color_scale,
node_size_column=node_size_column,
node_size_default=node_size_default,
node_size_minimum=node_size_minimum,
Expand All @@ -331,10 +318,6 @@ def run(input_file: KGTKFiles,
node_border_color=node_border_color,
tooltip_column=tooltip_column,
show_text=show_text,
node_categorical_scale=node_categorical_scale,
edge_categorical_scale=edge_categorical_scale,
node_gradient_scale=node_gradient_scale,
edge_gradient_scale=edge_gradient_scale,
show_blank_labels=show_blank_labels,
kwargs=kwargs
)
Expand Down
14 changes: 14 additions & 0 deletions kgtk/configure_kgtk_notebooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,3 +171,17 @@ def load_files_into_cache(self):
kypher_command += " --limit 3"
print(kypher_command)
print(subprocess.getoutput(kypher_command))

def print_kgtk_file_names(self, file_names=None):
if file_names is not None:
if not type(file_names) == list:
file_names = [file_names]
for file_name in file_names:
if file_name not in self.graph_files:
print(f"Unknown file name: {file_name}.")
else:
print(f"{file_name}: {self.graph_files[file_name]}")
else:
print("Printing a list of all known KGTK file names...")
for key in self.graph_files:
print(f"{key}: {self.graph_files[key]}")
35 changes: 34 additions & 1 deletion kgtk/kypher/sqlstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -2369,7 +2369,7 @@ def kgtk_geo_coords_long(x):
SqliteStore.register_user_function('kgtk_geo_coords_long', 1, kgtk_geo_coords_long, deterministic=True)


# Literals:
# Literals and symbols:

literal_regex = re.compile(r'''^["'^@!0-9.+-]|^True$|^False$''')

Expand All @@ -2381,6 +2381,39 @@ def kgtk_literal(x):

SqliteStore.register_user_function('kgtk_literal', 1, kgtk_literal, deterministic=True)

def kgtk_symbol(x):
"""Return True if 'x' is a KGTK symbol. This assumes valid literals
and only tests the first character (except for booleans).
"""
return isinstance(x, str) and literal_regex.match(x) is None

SqliteStore.register_user_function('kgtk_symbol', 1, kgtk_symbol, deterministic=True)


value_type_regex = re.compile(
'|'.join([r'(?P<string>^")',
r"(?P<lq_string>^')",
r'(?P<date_time>^\^)',
r'(?P<quantity>^[0-9.+-])',
r'(?P<geo_coord>^@)',
r'(?P<boolean>^(True$|False$))',
r'(?P<typed_literal>^!)',
r'(?P<symbol>.)',
]))

def kgtk_type(x):
"""Return a type description for the KGTK literal or symbol 'x'. The returned type
will be one of 'string', 'lq_string', 'date_time', 'quantity', 'geo_coord', 'boolean',
'typed_literal' or 'symbol'. This assumes valid literals and only tests the first
character (except for booleans).
"""
if isinstance(x, str):
m = value_type_regex.search(x)
if m:
return m.lastgroup

SqliteStore.register_user_function('kgtk_type', 1, kgtk_type, deterministic=True)


# NULL value utilities:

Expand Down
Loading

0 comments on commit 2489050

Please sign in to comment.