diff --git a/tests/unit/test_query/test_memgraph_user_collection_query.py b/tests/unit/test_query/test_memgraph_user_collection_query.py index 772d4f84..038fb438 100644 --- a/tests/unit/test_query/test_memgraph_user_collection_query.py +++ b/tests/unit/test_query/test_memgraph_user_collection_query.py @@ -6,7 +6,7 @@ import pytest from unittest.mock import MagicMock, patch from trustgraph.query.triples.memgraph.service import Processor -from trustgraph.schema import TriplesQueryRequest, Value +from trustgraph.schema import TriplesQueryRequest, Term, IRI, LITERAL class TestMemgraphQueryUserCollectionIsolation: @@ -24,9 +24,9 @@ class TestMemgraphQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), - p=Value(value="http://example.com/p", is_uri=True), - o=Value(value="test_object", is_uri=False), + s=Term(type=IRI, iri="http://example.com/s"), + p=Term(type=IRI, iri="http://example.com/p"), + o=Term(type=LITERAL, value="test_object"), limit=1000 ) @@ -65,8 +65,8 @@ class TestMemgraphQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), - p=Value(value="http://example.com/p", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), + p=Term(type=IRI, iri="http://example.com/p"), o=None, limit=1000 ) @@ -105,9 +105,9 @@ class TestMemgraphQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, - o=Value(value="http://example.com/o", is_uri=True), + o=Term(type=IRI, iri="http://example.com/o"), limit=1000 ) @@ -145,7 +145,7 @@ class TestMemgraphQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, o=None, limit=1000 @@ -185,8 +185,8 @@ class TestMemgraphQueryUserCollectionIsolation: user="test_user", collection="test_collection", s=None, - p=Value(value="http://example.com/p", is_uri=True), - o=Value(value="literal", is_uri=False), + p=Term(type=IRI, iri="http://example.com/p"), + o=Term(type=LITERAL, value="literal"), limit=1000 ) @@ -225,7 +225,7 @@ class TestMemgraphQueryUserCollectionIsolation: user="test_user", collection="test_collection", s=None, - p=Value(value="http://example.com/p", is_uri=True), + p=Term(type=IRI, iri="http://example.com/p"), o=None, limit=1000 ) @@ -265,7 +265,7 @@ class TestMemgraphQueryUserCollectionIsolation: collection="test_collection", s=None, p=None, - o=Value(value="test_value", is_uri=False), + o=Term(type=LITERAL, value="test_value"), limit=1000 ) @@ -355,7 +355,7 @@ class TestMemgraphQueryUserCollectionIsolation: # Query without user/collection fields query = TriplesQueryRequest( - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, o=None, limit=1000 @@ -385,7 +385,7 @@ class TestMemgraphQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, o=None, limit=1000 @@ -416,17 +416,17 @@ class TestMemgraphQueryUserCollectionIsolation: assert len(result) == 2 # First triple (literal object) - assert result[0].s.value == "http://example.com/s" - assert result[0].s.is_uri == True - assert result[0].p.value == "http://example.com/p1" - assert result[0].p.is_uri == True + assert result[0].s.iri == "http://example.com/s" + assert result[0].s.type == IRI + assert result[0].p.iri == "http://example.com/p1" + assert result[0].p.type == IRI assert result[0].o.value == "literal_value" - assert result[0].o.is_uri == False - + assert result[0].o.type == LITERAL + # Second triple (URI object) - assert result[1].s.value == "http://example.com/s" - assert result[1].s.is_uri == True - assert result[1].p.value == "http://example.com/p2" - assert result[1].p.is_uri == True - assert result[1].o.value == "http://example.com/o" - assert result[1].o.is_uri == True \ No newline at end of file + assert result[1].s.iri == "http://example.com/s" + assert result[1].s.type == IRI + assert result[1].p.iri == "http://example.com/p2" + assert result[1].p.type == IRI + assert result[1].o.iri == "http://example.com/o" + assert result[1].o.type == IRI \ No newline at end of file diff --git a/tests/unit/test_query/test_neo4j_user_collection_query.py b/tests/unit/test_query/test_neo4j_user_collection_query.py index f7ac10ea..d9cf1eb4 100644 --- a/tests/unit/test_query/test_neo4j_user_collection_query.py +++ b/tests/unit/test_query/test_neo4j_user_collection_query.py @@ -24,9 +24,9 @@ class TestNeo4jQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), - p=Value(value="http://example.com/p", is_uri=True), - o=Value(value="test_object", is_uri=False), + s=Term(type=IRI, iri="http://example.com/s"), + p=Term(type=IRI, iri="http://example.com/p"), + o=Term(type=LITERAL, value="test_object"), limit=10 ) @@ -65,8 +65,8 @@ class TestNeo4jQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), - p=Value(value="http://example.com/p", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), + p=Term(type=IRI, iri="http://example.com/p"), o=None, limit=10 ) @@ -123,9 +123,9 @@ class TestNeo4jQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, - o=Value(value="http://example.com/o", is_uri=True), + o=Term(type=IRI, iri="http://example.com/o"), limit=10 ) @@ -163,7 +163,7 @@ class TestNeo4jQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, o=None, limit=10 @@ -203,8 +203,8 @@ class TestNeo4jQueryUserCollectionIsolation: user="test_user", collection="test_collection", s=None, - p=Value(value="http://example.com/p", is_uri=True), - o=Value(value="literal", is_uri=False), + p=Term(type=IRI, iri="http://example.com/p"), + o=Term(type=LITERAL, value="literal"), limit=10 ) @@ -243,7 +243,7 @@ class TestNeo4jQueryUserCollectionIsolation: user="test_user", collection="test_collection", s=None, - p=Value(value="http://example.com/p", is_uri=True), + p=Term(type=IRI, iri="http://example.com/p"), o=None, limit=10 ) @@ -283,7 +283,7 @@ class TestNeo4jQueryUserCollectionIsolation: collection="test_collection", s=None, p=None, - o=Value(value="test_value", is_uri=False), + o=Term(type=LITERAL, value="test_value"), limit=10 ) @@ -373,7 +373,7 @@ class TestNeo4jQueryUserCollectionIsolation: # Query without user/collection fields query = TriplesQueryRequest( - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, o=None, limit=10 @@ -403,7 +403,7 @@ class TestNeo4jQueryUserCollectionIsolation: query = TriplesQueryRequest( user="test_user", collection="test_collection", - s=Value(value="http://example.com/s", is_uri=True), + s=Term(type=IRI, iri="http://example.com/s"), p=None, o=None, limit=10 @@ -434,17 +434,17 @@ class TestNeo4jQueryUserCollectionIsolation: assert len(result) == 2 # First triple (literal object) - assert result[0].s.value == "http://example.com/s" - assert result[0].s.is_uri == True - assert result[0].p.value == "http://example.com/p1" - assert result[0].p.is_uri == True + assert result[0].s.iri == "http://example.com/s" + assert result[0].s.type == IRI + assert result[0].p.iri == "http://example.com/p1" + assert result[0].p.type == IRI assert result[0].o.value == "literal_value" - assert result[0].o.is_uri == False - + assert result[0].o.type == LITERAL + # Second triple (URI object) - assert result[1].s.value == "http://example.com/s" - assert result[1].s.is_uri == True - assert result[1].p.value == "http://example.com/p2" - assert result[1].p.is_uri == True - assert result[1].o.value == "http://example.com/o" - assert result[1].o.is_uri == True \ No newline at end of file + assert result[1].s.iri == "http://example.com/s" + assert result[1].s.type == IRI + assert result[1].p.iri == "http://example.com/p2" + assert result[1].p.type == IRI + assert result[1].o.iri == "http://example.com/o" + assert result[1].o.type == IRI \ No newline at end of file diff --git a/tests/unit/test_query/test_triples_falkordb_query.py b/tests/unit/test_query/test_triples_falkordb_query.py index b2ac8bb5..0009e2cd 100644 --- a/tests/unit/test_query/test_triples_falkordb_query.py +++ b/tests/unit/test_query/test_triples_falkordb_query.py @@ -25,50 +25,50 @@ class TestFalkorDBQueryProcessor: def test_create_value_with_http_uri(self, processor): """Test create_value with HTTP URI""" result = processor.create_value("http://example.com/resource") - - assert isinstance(result, Value) - assert result.value == "http://example.com/resource" - assert result.is_uri is True + + assert isinstance(result, Term) + assert result.iri == "http://example.com/resource" + assert result.type == IRI def test_create_value_with_https_uri(self, processor): """Test create_value with HTTPS URI""" result = processor.create_value("https://example.com/resource") - - assert isinstance(result, Value) - assert result.value == "https://example.com/resource" - assert result.is_uri is True + + assert isinstance(result, Term) + assert result.iri == "https://example.com/resource" + assert result.type == IRI def test_create_value_with_literal(self, processor): """Test create_value with literal value""" result = processor.create_value("just a literal string") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "just a literal string" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_empty_string(self, processor): """Test create_value with empty string""" result = processor.create_value("") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_partial_uri(self, processor): """Test create_value with string that looks like URI but isn't complete""" result = processor.create_value("http") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "http" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_ftp_uri(self, processor): """Test create_value with FTP URI (should not be detected as URI)""" result = processor.create_value("ftp://example.com/file") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "ftp://example.com/file" - assert result.is_uri is False + assert result.type == LITERAL @patch('trustgraph.query.triples.falkordb.service.FalkorDB') def test_processor_initialization_with_defaults(self, mock_falkordb): @@ -125,9 +125,9 @@ class TestFalkorDBQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), - p=Value(value="http://example.com/predicate", is_uri=True), - o=Value(value="literal object", is_uri=False), + s=Term(type=IRI, iri="http://example.com/subject"), + p=Term(type=IRI, iri="http://example.com/predicate"), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -166,8 +166,8 @@ class TestFalkorDBQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), - p=Value(value="http://example.com/predicate", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), + p=Term(type=IRI, iri="http://example.com/predicate"), o=None, limit=100 ) @@ -211,9 +211,9 @@ class TestFalkorDBQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), p=None, - o=Value(value="literal object", is_uri=False), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -256,7 +256,7 @@ class TestFalkorDBQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), p=None, o=None, limit=100 @@ -302,8 +302,8 @@ class TestFalkorDBQueryProcessor: user='test_user', collection='test_collection', s=None, - p=Value(value="http://example.com/predicate", is_uri=True), - o=Value(value="literal object", is_uri=False), + p=Term(type=IRI, iri="http://example.com/predicate"), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -347,7 +347,7 @@ class TestFalkorDBQueryProcessor: user='test_user', collection='test_collection', s=None, - p=Value(value="http://example.com/predicate", is_uri=True), + p=Term(type=IRI, iri="http://example.com/predicate"), o=None, limit=100 ) @@ -393,7 +393,7 @@ class TestFalkorDBQueryProcessor: collection='test_collection', s=None, p=None, - o=Value(value="literal object", is_uri=False), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -476,7 +476,7 @@ class TestFalkorDBQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), p=None, o=None, limit=100 diff --git a/tests/unit/test_query/test_triples_memgraph_query.py b/tests/unit/test_query/test_triples_memgraph_query.py index de85e016..4e0fdddf 100644 --- a/tests/unit/test_query/test_triples_memgraph_query.py +++ b/tests/unit/test_query/test_triples_memgraph_query.py @@ -25,50 +25,50 @@ class TestMemgraphQueryProcessor: def test_create_value_with_http_uri(self, processor): """Test create_value with HTTP URI""" result = processor.create_value("http://example.com/resource") - - assert isinstance(result, Value) - assert result.value == "http://example.com/resource" - assert result.is_uri is True + + assert isinstance(result, Term) + assert result.iri == "http://example.com/resource" + assert result.type == IRI def test_create_value_with_https_uri(self, processor): """Test create_value with HTTPS URI""" result = processor.create_value("https://example.com/resource") - - assert isinstance(result, Value) - assert result.value == "https://example.com/resource" - assert result.is_uri is True + + assert isinstance(result, Term) + assert result.iri == "https://example.com/resource" + assert result.type == IRI def test_create_value_with_literal(self, processor): """Test create_value with literal value""" result = processor.create_value("just a literal string") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "just a literal string" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_empty_string(self, processor): """Test create_value with empty string""" result = processor.create_value("") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_partial_uri(self, processor): """Test create_value with string that looks like URI but isn't complete""" result = processor.create_value("http") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "http" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_ftp_uri(self, processor): """Test create_value with FTP URI (should not be detected as URI)""" result = processor.create_value("ftp://example.com/file") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "ftp://example.com/file" - assert result.is_uri is False + assert result.type == LITERAL @patch('trustgraph.query.triples.memgraph.service.GraphDatabase') def test_processor_initialization_with_defaults(self, mock_graph_db): @@ -124,9 +124,9 @@ class TestMemgraphQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), - p=Value(value="http://example.com/predicate", is_uri=True), - o=Value(value="literal object", is_uri=False), + s=Term(type=IRI, iri="http://example.com/subject"), + p=Term(type=IRI, iri="http://example.com/predicate"), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -166,8 +166,8 @@ class TestMemgraphQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), - p=Value(value="http://example.com/predicate", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), + p=Term(type=IRI, iri="http://example.com/predicate"), o=None, limit=100 ) @@ -212,9 +212,9 @@ class TestMemgraphQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), p=None, - o=Value(value="literal object", is_uri=False), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -258,7 +258,7 @@ class TestMemgraphQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), p=None, o=None, limit=100 @@ -305,8 +305,8 @@ class TestMemgraphQueryProcessor: user='test_user', collection='test_collection', s=None, - p=Value(value="http://example.com/predicate", is_uri=True), - o=Value(value="literal object", is_uri=False), + p=Term(type=IRI, iri="http://example.com/predicate"), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -351,7 +351,7 @@ class TestMemgraphQueryProcessor: user='test_user', collection='test_collection', s=None, - p=Value(value="http://example.com/predicate", is_uri=True), + p=Term(type=IRI, iri="http://example.com/predicate"), o=None, limit=100 ) @@ -398,7 +398,7 @@ class TestMemgraphQueryProcessor: collection='test_collection', s=None, p=None, - o=Value(value="literal object", is_uri=False), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -480,7 +480,7 @@ class TestMemgraphQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), p=None, o=None, limit=100 diff --git a/tests/unit/test_query/test_triples_neo4j_query.py b/tests/unit/test_query/test_triples_neo4j_query.py index 872b45f6..ee00783a 100644 --- a/tests/unit/test_query/test_triples_neo4j_query.py +++ b/tests/unit/test_query/test_triples_neo4j_query.py @@ -25,50 +25,50 @@ class TestNeo4jQueryProcessor: def test_create_value_with_http_uri(self, processor): """Test create_value with HTTP URI""" result = processor.create_value("http://example.com/resource") - - assert isinstance(result, Value) - assert result.value == "http://example.com/resource" - assert result.is_uri is True + + assert isinstance(result, Term) + assert result.iri == "http://example.com/resource" + assert result.type == IRI def test_create_value_with_https_uri(self, processor): """Test create_value with HTTPS URI""" result = processor.create_value("https://example.com/resource") - - assert isinstance(result, Value) - assert result.value == "https://example.com/resource" - assert result.is_uri is True + + assert isinstance(result, Term) + assert result.iri == "https://example.com/resource" + assert result.type == IRI def test_create_value_with_literal(self, processor): """Test create_value with literal value""" result = processor.create_value("just a literal string") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "just a literal string" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_empty_string(self, processor): """Test create_value with empty string""" result = processor.create_value("") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_partial_uri(self, processor): """Test create_value with string that looks like URI but isn't complete""" result = processor.create_value("http") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "http" - assert result.is_uri is False + assert result.type == LITERAL def test_create_value_with_ftp_uri(self, processor): """Test create_value with FTP URI (should not be detected as URI)""" result = processor.create_value("ftp://example.com/file") - - assert isinstance(result, Value) + + assert isinstance(result, Term) assert result.value == "ftp://example.com/file" - assert result.is_uri is False + assert result.type == LITERAL @patch('trustgraph.query.triples.neo4j.service.GraphDatabase') def test_processor_initialization_with_defaults(self, mock_graph_db): @@ -124,9 +124,9 @@ class TestNeo4jQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), - p=Value(value="http://example.com/predicate", is_uri=True), - o=Value(value="literal object", is_uri=False), + s=Term(type=IRI, iri="http://example.com/subject"), + p=Term(type=IRI, iri="http://example.com/predicate"), + o=Term(type=LITERAL, value="literal object"), limit=100 ) @@ -166,8 +166,8 @@ class TestNeo4jQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), - p=Value(value="http://example.com/predicate", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), + p=Term(type=IRI, iri="http://example.com/predicate"), o=None, limit=100 ) @@ -250,12 +250,12 @@ class TestNeo4jQueryProcessor: query = TriplesQueryRequest( user='test_user', collection='test_collection', - s=Value(value="http://example.com/subject", is_uri=True), + s=Term(type=IRI, iri="http://example.com/subject"), p=None, o=None, limit=100 ) - + # Should raise the exception with pytest.raises(Exception, match="Database connection failed"): await processor.query_triples(query) diff --git a/trustgraph-flow/trustgraph/query/triples/falkordb/service.py b/trustgraph-flow/trustgraph/query/triples/falkordb/service.py index d1c7be7d..14b24d52 100755 --- a/trustgraph-flow/trustgraph/query/triples/falkordb/service.py +++ b/trustgraph-flow/trustgraph/query/triples/falkordb/service.py @@ -10,12 +10,24 @@ import logging from falkordb import FalkorDB from .... schema import TriplesQueryRequest, TriplesQueryResponse, Error -from .... schema import Value, Triple +from .... schema import Term, Triple, IRI, LITERAL from .... base import TriplesQueryService # Module logger logger = logging.getLogger(__name__) + +def get_term_value(term): + """Extract the string value from a Term""" + if term is None: + return None + if term.type == IRI: + return term.iri + elif term.type == LITERAL: + return term.value + else: + return term.id or term.value + default_ident = "triples-query" default_graph_url = 'falkor://falkordb:6379' @@ -42,9 +54,9 @@ class Processor(TriplesQueryService): def create_value(self, ent): if ent.startswith("http://") or ent.startswith("https://"): - return Value(value=ent, is_uri=True) + return Term(type=IRI, iri=ent) else: - return Value(value=ent, is_uri=False) + return Term(type=LITERAL, value=ent) async def query_triples(self, query): @@ -63,28 +75,28 @@ class Processor(TriplesQueryService): "RETURN $src as src " "LIMIT " + str(query.limit), params={ - "src": query.s.value, - "rel": query.p.value, - "value": query.o.value, + "src": get_term_value(query.s), + "rel": get_term_value(query.p), + "value": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((query.s.value, query.p.value, query.o.value)) + triples.append((get_term_value(query.s), get_term_value(query.p), get_term_value(query.o))) records = self.io.query( "MATCH (src:Node {uri: $src})-[rel:Rel {uri: $rel}]->(dest:Node {uri: $uri}) " "RETURN $src as src " "LIMIT " + str(query.limit), params={ - "src": query.s.value, - "rel": query.p.value, - "uri": query.o.value, + "src": get_term_value(query.s), + "rel": get_term_value(query.p), + "uri": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((query.s.value, query.p.value, query.o.value)) + triples.append((get_term_value(query.s), get_term_value(query.p), get_term_value(query.o))) else: @@ -95,26 +107,26 @@ class Processor(TriplesQueryService): "RETURN dest.value as dest " "LIMIT " + str(query.limit), params={ - "src": query.s.value, - "rel": query.p.value, + "src": get_term_value(query.s), + "rel": get_term_value(query.p), }, ).result_set for rec in records: - triples.append((query.s.value, query.p.value, rec[0])) + triples.append((get_term_value(query.s), get_term_value(query.p), rec[0])) records = self.io.query( "MATCH (src:Node {uri: $src})-[rel:Rel {uri: $rel}]->(dest:Node) " "RETURN dest.uri as dest " "LIMIT " + str(query.limit), params={ - "src": query.s.value, - "rel": query.p.value, + "src": get_term_value(query.s), + "rel": get_term_value(query.p), }, ).result_set for rec in records: - triples.append((query.s.value, query.p.value, rec[0])) + triples.append((get_term_value(query.s), get_term_value(query.p), rec[0])) else: @@ -127,26 +139,26 @@ class Processor(TriplesQueryService): "RETURN rel.uri as rel " "LIMIT " + str(query.limit), params={ - "src": query.s.value, - "value": query.o.value, + "src": get_term_value(query.s), + "value": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((query.s.value, rec[0], query.o.value)) + triples.append((get_term_value(query.s), rec[0], get_term_value(query.o))) records = self.io.query( "MATCH (src:Node {uri: $src})-[rel:Rel]->(dest:Node {uri: $uri}) " "RETURN rel.uri as rel " "LIMIT " + str(query.limit), params={ - "src": query.s.value, - "uri": query.o.value, + "src": get_term_value(query.s), + "uri": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((query.s.value, rec[0], query.o.value)) + triples.append((get_term_value(query.s), rec[0], get_term_value(query.o))) else: @@ -157,24 +169,24 @@ class Processor(TriplesQueryService): "RETURN rel.uri as rel, dest.value as dest " "LIMIT " + str(query.limit), params={ - "src": query.s.value, + "src": get_term_value(query.s), }, ).result_set for rec in records: - triples.append((query.s.value, rec[0], rec[1])) + triples.append((get_term_value(query.s), rec[0], rec[1])) records = self.io.query( "MATCH (src:Node {uri: $src})-[rel:Rel]->(dest:Node) " "RETURN rel.uri as rel, dest.uri as dest " "LIMIT " + str(query.limit), params={ - "src": query.s.value, + "src": get_term_value(query.s), }, ).result_set for rec in records: - triples.append((query.s.value, rec[0], rec[1])) + triples.append((get_term_value(query.s), rec[0], rec[1])) else: @@ -190,26 +202,26 @@ class Processor(TriplesQueryService): "RETURN src.uri as src " "LIMIT " + str(query.limit), params={ - "uri": query.p.value, - "value": query.o.value, + "uri": get_term_value(query.p), + "value": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((rec[0], query.p.value, query.o.value)) + triples.append((rec[0], get_term_value(query.p), get_term_value(query.o))) records = self.io.query( "MATCH (src:Node)-[rel:Rel {uri: $uri}]->(dest:Node {uri: $dest}) " "RETURN src.uri as src " "LIMIT " + str(query.limit), params={ - "uri": query.p.value, - "dest": query.o.value, + "uri": get_term_value(query.p), + "dest": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((rec[0], query.p.value, query.o.value)) + triples.append((rec[0], get_term_value(query.p), get_term_value(query.o))) else: @@ -220,24 +232,24 @@ class Processor(TriplesQueryService): "RETURN src.uri as src, dest.value as dest " "LIMIT " + str(query.limit), params={ - "uri": query.p.value, + "uri": get_term_value(query.p), }, ).result_set for rec in records: - triples.append((rec[0], query.p.value, rec[1])) + triples.append((rec[0], get_term_value(query.p), rec[1])) records = self.io.query( "MATCH (src:Node)-[rel:Rel {uri: $uri}]->(dest:Node) " "RETURN src.uri as src, dest.uri as dest " "LIMIT " + str(query.limit), params={ - "uri": query.p.value, + "uri": get_term_value(query.p), }, ).result_set for rec in records: - triples.append((rec[0], query.p.value, rec[1])) + triples.append((rec[0], get_term_value(query.p), rec[1])) else: @@ -250,24 +262,24 @@ class Processor(TriplesQueryService): "RETURN src.uri as src, rel.uri as rel " "LIMIT " + str(query.limit), params={ - "value": query.o.value, + "value": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((rec[0], rec[1], query.o.value)) + triples.append((rec[0], rec[1], get_term_value(query.o))) records = self.io.query( "MATCH (src:Node)-[rel:Rel]->(dest:Node {uri: $uri}) " "RETURN src.uri as src, rel.uri as rel " "LIMIT " + str(query.limit), params={ - "uri": query.o.value, + "uri": get_term_value(query.o), }, ).result_set for rec in records: - triples.append((rec[0], rec[1], query.o.value)) + triples.append((rec[0], rec[1], get_term_value(query.o))) else: diff --git a/trustgraph-flow/trustgraph/query/triples/memgraph/service.py b/trustgraph-flow/trustgraph/query/triples/memgraph/service.py index 262f89ab..37633f34 100755 --- a/trustgraph-flow/trustgraph/query/triples/memgraph/service.py +++ b/trustgraph-flow/trustgraph/query/triples/memgraph/service.py @@ -10,12 +10,24 @@ import logging from neo4j import GraphDatabase from .... schema import TriplesQueryRequest, TriplesQueryResponse, Error -from .... schema import Value, Triple +from .... schema import Term, Triple, IRI, LITERAL from .... base import TriplesQueryService # Module logger logger = logging.getLogger(__name__) + +def get_term_value(term): + """Extract the string value from a Term""" + if term is None: + return None + if term.type == IRI: + return term.iri + elif term.type == LITERAL: + return term.value + else: + return term.id or term.value + default_ident = "triples-query" default_graph_host = 'bolt://memgraph:7687' @@ -47,9 +59,9 @@ class Processor(TriplesQueryService): def create_value(self, ent): if ent.startswith("http://") or ent.startswith("https://"): - return Value(value=ent, is_uri=True) + return Term(type=IRI, iri=ent) else: - return Value(value=ent, is_uri=False) + return Term(type=LITERAL, value=ent) async def query_triples(self, query): @@ -73,13 +85,13 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN $src as src " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, value=query.o.value, + src=get_term_value(query.s), rel=get_term_value(query.p), value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: - triples.append((query.s.value, query.p.value, query.o.value)) + triples.append((get_term_value(query.s), get_term_value(query.p), get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -87,13 +99,13 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $uri, user: $user, collection: $collection}) " "RETURN $src as src " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, uri=query.o.value, + src=get_term_value(query.s), rel=get_term_value(query.p), uri=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: - triples.append((query.s.value, query.p.value, query.o.value)) + triples.append((get_term_value(query.s), get_term_value(query.p), get_term_value(query.o))) else: @@ -105,14 +117,14 @@ class Processor(TriplesQueryService): "(dest:Literal {user: $user, collection: $collection}) " "RETURN dest.value as dest " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, + src=get_term_value(query.s), rel=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, query.p.value, data["dest"])) + triples.append((get_term_value(query.s), get_term_value(query.p), data["dest"])) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -120,14 +132,14 @@ class Processor(TriplesQueryService): "(dest:Node {user: $user, collection: $collection}) " "RETURN dest.uri as dest " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, + src=get_term_value(query.s), rel=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, query.p.value, data["dest"])) + triples.append((get_term_value(query.s), get_term_value(query.p), data["dest"])) else: @@ -141,14 +153,14 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN rel.uri as rel " "LIMIT " + str(query.limit), - src=query.s.value, value=query.o.value, + src=get_term_value(query.s), value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], query.o.value)) + triples.append((get_term_value(query.s), data["rel"], get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -156,14 +168,14 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $uri, user: $user, collection: $collection}) " "RETURN rel.uri as rel " "LIMIT " + str(query.limit), - src=query.s.value, uri=query.o.value, + src=get_term_value(query.s), uri=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], query.o.value)) + triples.append((get_term_value(query.s), data["rel"], get_term_value(query.o))) else: @@ -175,14 +187,14 @@ class Processor(TriplesQueryService): "(dest:Literal {user: $user, collection: $collection}) " "RETURN rel.uri as rel, dest.value as dest " "LIMIT " + str(query.limit), - src=query.s.value, + src=get_term_value(query.s), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], data["dest"])) + triples.append((get_term_value(query.s), data["rel"], data["dest"])) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -190,14 +202,14 @@ class Processor(TriplesQueryService): "(dest:Node {user: $user, collection: $collection}) " "RETURN rel.uri as rel, dest.uri as dest " "LIMIT " + str(query.limit), - src=query.s.value, + src=get_term_value(query.s), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], data["dest"])) + triples.append((get_term_value(query.s), data["rel"], data["dest"])) else: @@ -214,14 +226,14 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN src.uri as src " "LIMIT " + str(query.limit), - uri=query.p.value, value=query.o.value, + uri=get_term_value(query.p), value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, query.o.value)) + triples.append((data["src"], get_term_value(query.p), get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {user: $user, collection: $collection})-" @@ -229,14 +241,14 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $dest, user: $user, collection: $collection}) " "RETURN src.uri as src " "LIMIT " + str(query.limit), - uri=query.p.value, dest=query.o.value, + uri=get_term_value(query.p), dest=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, query.o.value)) + triples.append((data["src"], get_term_value(query.p), get_term_value(query.o))) else: @@ -248,14 +260,14 @@ class Processor(TriplesQueryService): "(dest:Literal {user: $user, collection: $collection}) " "RETURN src.uri as src, dest.value as dest " "LIMIT " + str(query.limit), - uri=query.p.value, + uri=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, data["dest"])) + triples.append((data["src"], get_term_value(query.p), data["dest"])) records, summary, keys = self.io.execute_query( "MATCH (src:Node {user: $user, collection: $collection})-" @@ -263,14 +275,14 @@ class Processor(TriplesQueryService): "(dest:Node {user: $user, collection: $collection}) " "RETURN src.uri as src, dest.uri as dest " "LIMIT " + str(query.limit), - uri=query.p.value, + uri=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, data["dest"])) + triples.append((data["src"], get_term_value(query.p), data["dest"])) else: @@ -284,14 +296,14 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN src.uri as src, rel.uri as rel " "LIMIT " + str(query.limit), - value=query.o.value, + value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], data["rel"], query.o.value)) + triples.append((data["src"], data["rel"], get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {user: $user, collection: $collection})-" @@ -299,14 +311,14 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $uri, user: $user, collection: $collection}) " "RETURN src.uri as src, rel.uri as rel " "LIMIT " + str(query.limit), - uri=query.o.value, + uri=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], data["rel"], query.o.value)) + triples.append((data["src"], data["rel"], get_term_value(query.o))) else: diff --git a/trustgraph-flow/trustgraph/query/triples/neo4j/service.py b/trustgraph-flow/trustgraph/query/triples/neo4j/service.py index 8c513a67..4cb1ab21 100755 --- a/trustgraph-flow/trustgraph/query/triples/neo4j/service.py +++ b/trustgraph-flow/trustgraph/query/triples/neo4j/service.py @@ -10,12 +10,24 @@ import logging from neo4j import GraphDatabase from .... schema import TriplesQueryRequest, TriplesQueryResponse, Error -from .... schema import Value, Triple +from .... schema import Term, Triple, IRI, LITERAL from .... base import TriplesQueryService # Module logger logger = logging.getLogger(__name__) + +def get_term_value(term): + """Extract the string value from a Term""" + if term is None: + return None + if term.type == IRI: + return term.iri + elif term.type == LITERAL: + return term.value + else: + return term.id or term.value + default_ident = "triples-query" default_graph_host = 'bolt://neo4j:7687' @@ -47,9 +59,9 @@ class Processor(TriplesQueryService): def create_value(self, ent): if ent.startswith("http://") or ent.startswith("https://"): - return Value(value=ent, is_uri=True) + return Term(type=IRI, iri=ent) else: - return Value(value=ent, is_uri=False) + return Term(type=LITERAL, value=ent) async def query_triples(self, query): @@ -73,13 +85,13 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN $src as src " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, value=query.o.value, + src=get_term_value(query.s), rel=get_term_value(query.p), value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: - triples.append((query.s.value, query.p.value, query.o.value)) + triples.append((get_term_value(query.s), get_term_value(query.p), get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -87,13 +99,13 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $uri, user: $user, collection: $collection}) " "RETURN $src as src " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, uri=query.o.value, + src=get_term_value(query.s), rel=get_term_value(query.p), uri=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: - triples.append((query.s.value, query.p.value, query.o.value)) + triples.append((get_term_value(query.s), get_term_value(query.p), get_term_value(query.o))) else: @@ -105,14 +117,14 @@ class Processor(TriplesQueryService): "(dest:Literal {user: $user, collection: $collection}) " "RETURN dest.value as dest " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, + src=get_term_value(query.s), rel=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, query.p.value, data["dest"])) + triples.append((get_term_value(query.s), get_term_value(query.p), data["dest"])) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -120,14 +132,14 @@ class Processor(TriplesQueryService): "(dest:Node {user: $user, collection: $collection}) " "RETURN dest.uri as dest " "LIMIT " + str(query.limit), - src=query.s.value, rel=query.p.value, + src=get_term_value(query.s), rel=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, query.p.value, data["dest"])) + triples.append((get_term_value(query.s), get_term_value(query.p), data["dest"])) else: @@ -141,14 +153,14 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN rel.uri as rel " "LIMIT " + str(query.limit), - src=query.s.value, value=query.o.value, + src=get_term_value(query.s), value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], query.o.value)) + triples.append((get_term_value(query.s), data["rel"], get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -156,14 +168,14 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $uri, user: $user, collection: $collection}) " "RETURN rel.uri as rel " "LIMIT " + str(query.limit), - src=query.s.value, uri=query.o.value, + src=get_term_value(query.s), uri=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], query.o.value)) + triples.append((get_term_value(query.s), data["rel"], get_term_value(query.o))) else: @@ -175,14 +187,14 @@ class Processor(TriplesQueryService): "(dest:Literal {user: $user, collection: $collection}) " "RETURN rel.uri as rel, dest.value as dest " "LIMIT " + str(query.limit), - src=query.s.value, + src=get_term_value(query.s), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], data["dest"])) + triples.append((get_term_value(query.s), data["rel"], data["dest"])) records, summary, keys = self.io.execute_query( "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-" @@ -190,14 +202,14 @@ class Processor(TriplesQueryService): "(dest:Node {user: $user, collection: $collection}) " "RETURN rel.uri as rel, dest.uri as dest " "LIMIT " + str(query.limit), - src=query.s.value, + src=get_term_value(query.s), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((query.s.value, data["rel"], data["dest"])) + triples.append((get_term_value(query.s), data["rel"], data["dest"])) else: @@ -214,14 +226,14 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN src.uri as src " "LIMIT " + str(query.limit), - uri=query.p.value, value=query.o.value, + uri=get_term_value(query.p), value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, query.o.value)) + triples.append((data["src"], get_term_value(query.p), get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {user: $user, collection: $collection})-" @@ -229,14 +241,14 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $dest, user: $user, collection: $collection}) " "RETURN src.uri as src " "LIMIT " + str(query.limit), - uri=query.p.value, dest=query.o.value, + uri=get_term_value(query.p), dest=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, query.o.value)) + triples.append((data["src"], get_term_value(query.p), get_term_value(query.o))) else: @@ -248,14 +260,14 @@ class Processor(TriplesQueryService): "(dest:Literal {user: $user, collection: $collection}) " "RETURN src.uri as src, dest.value as dest " "LIMIT " + str(query.limit), - uri=query.p.value, + uri=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, data["dest"])) + triples.append((data["src"], get_term_value(query.p), data["dest"])) records, summary, keys = self.io.execute_query( "MATCH (src:Node {user: $user, collection: $collection})-" @@ -263,14 +275,14 @@ class Processor(TriplesQueryService): "(dest:Node {user: $user, collection: $collection}) " "RETURN src.uri as src, dest.uri as dest " "LIMIT " + str(query.limit), - uri=query.p.value, + uri=get_term_value(query.p), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], query.p.value, data["dest"])) + triples.append((data["src"], get_term_value(query.p), data["dest"])) else: @@ -284,14 +296,14 @@ class Processor(TriplesQueryService): "(dest:Literal {value: $value, user: $user, collection: $collection}) " "RETURN src.uri as src, rel.uri as rel " "LIMIT " + str(query.limit), - value=query.o.value, + value=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], data["rel"], query.o.value)) + triples.append((data["src"], data["rel"], get_term_value(query.o))) records, summary, keys = self.io.execute_query( "MATCH (src:Node {user: $user, collection: $collection})-" @@ -299,14 +311,14 @@ class Processor(TriplesQueryService): "(dest:Node {uri: $uri, user: $user, collection: $collection}) " "RETURN src.uri as src, rel.uri as rel " "LIMIT " + str(query.limit), - uri=query.o.value, + uri=get_term_value(query.o), user=user, collection=collection, database_=self.db, ) for rec in records: data = rec.data() - triples.append((data["src"], data["rel"], query.o.value)) + triples.append((data["src"], data["rel"], get_term_value(query.o))) else: