test_prodcom_correspondence.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python3
  2. import pytest
  3. from numpy import isnan
  4. from hashlib import sha256
  5. from rdflib import Namespace
  6. from probs_runner import PROBS, QUANTITYKIND, answer_queries
  7. from numpy.testing import assert_allclose
  8. from decimal import Decimal
  9. #from uuid import uuid4
  10. PRODCOM2016 = Namespace("http://w3id.org/probs-lab/data/prodcom/2016/")
  11. PRODCOM2017 = Namespace("http://w3id.org/probs-lab/data/prodcom/2017/")
  12. GEONAMES = Namespace("https://sws.geonames.org/")
  13. def assert_exact_results(result, expected_value):
  14. assert len(result) == 1
  15. assert result[0].bound == PROBS.ExactBound
  16. assert_allclose(result[0].measurement, expected_value, rtol=1e-3)
  17. def assert_no_measurement(result):
  18. assert len(result) == 1
  19. assert isnan(result[0].measurement)
  20. class TestProdcomCorrespondence:
  21. """Test PRODCOM Correspondence File Conversion"""
  22. endpoint_data = ["outputs/PRC_2017_2016.nt.gz",
  23. "outputs/PRD_2016_20200617_185122.nt.gz",
  24. "outputs/PRD_2017_20200617_185035.nt.gz"
  25. ]
  26. @pytest.mark.parametrize("code", [
  27. ("10112000"), ("22197120"), ("26601170")
  28. ])
  29. def test_object_equivalence(self, rdfox, code):
  30. # object has same code in PRODCOM 2016 and 2017 lists
  31. obj_name = "\"PRODCOM Object from Code " + code + "\""
  32. query = r""" PREFIX ufpc: <http://w3id.org/probs-lab/data/prodcom/>
  33. SELECT ?a ?b WHERE {
  34. ?a rdfs:label %s ;
  35. :hasClassificationCode ?c.
  36. ?c :partOfList ufpc:Prodcom2016List .
  37. ?b rdfs:label %s ;
  38. :hasClassificationCode ?d.
  39. ?d :partOfList ufpc:Prodcom2017List .
  40. ?b :objectEquivalentTo ?a .
  41. } """ % (obj_name, obj_name)
  42. result = rdfox.query_records(query)
  43. assert len(result) == 1
  44. @pytest.mark.parametrize("code", [
  45. ("20201100"), ("265100Z0"), ("28491290")
  46. ])
  47. def test_new_object(self, rdfox, code):
  48. # new object in PRODCOM 2017 list
  49. obj_name = "\"PRODCOM Object from Code " + code + "\""
  50. query = r""" PREFIX ufpc: <http://w3id.org/probs-lab/data/prodcom/>
  51. SELECT ?a WHERE {
  52. ?a rdfs:label %s ;
  53. :hasClassificationCode ?c .
  54. ?c :partOfList ufpc:Prodcom2017List .
  55. FILTER NOT EXISTS {
  56. ?b :hasClassificationCode ?d .
  57. ?d :partOfList ufpc:Prodcom2016List .
  58. ?a :objectEquivalentTo ?b .
  59. }
  60. } """ % (obj_name)
  61. result = rdfox.query_records(query)
  62. assert len(result) == 1
  63. @pytest.mark.parametrize("code", [
  64. ("23311073"), ("28302370"), ("32403990")
  65. ])
  66. def test_object_deleted(self, rdfox, code):
  67. # object in PRODCOM 2016 list deleted in 2017 list
  68. obj_name = "\"PRODCOM Object from Code " + code + "\""
  69. query = r""" PREFIX ufpc: <http://w3id.org/probs-lab/data/prodcom/>
  70. SELECT ?a WHERE {
  71. ?a rdfs:label %s ;
  72. :hasClassificationCode ?c .
  73. ?c :partOfList ufpc:Prodcom2016List .
  74. FILTER NOT EXISTS {
  75. ?b :hasClassificationCode ?d .
  76. ?d :partOfList ufpc:Prodcom2017List .
  77. ?b :objectEquivalentTo ?a .
  78. }
  79. } """ % (obj_name)
  80. result = rdfox.query_records(query)
  81. assert len(result) == 1