Changed schema for Value -> Term, majorly breaking change (#622)

* Changed schema for Value -> Term, majorly breaking change

* Following the schema change, Value -> Term into all processing

* Updated Cassandra for g, p, s, o index patterns (7 indexes)

* Reviewed and updated all tests

* Neo4j, Memgraph and FalkorDB remain broken, will look at once settled down
This commit is contained in:
cybermaggedon 2026-01-27 13:48:08 +00:00 committed by GitHub
parent e061f2c633
commit cf0daedefa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
86 changed files with 2458 additions and 1764 deletions

View file

@ -8,7 +8,7 @@ import logging
from .... direct.milvus_doc_embeddings import DocVectors
from .... schema import DocumentEmbeddingsResponse
from .... schema import Error, Value
from .... schema import Error
from .... base import DocumentEmbeddingsQueryService
# Module logger

View file

@ -11,7 +11,7 @@ from qdrant_client.models import PointStruct
from qdrant_client.models import Distance, VectorParams
from .... schema import DocumentEmbeddingsResponse
from .... schema import Error, Value
from .... schema import Error
from .... base import DocumentEmbeddingsQueryService
# Module logger

View file

@ -8,7 +8,7 @@ import logging
from .... direct.milvus_graph_embeddings import EntityVectors
from .... schema import GraphEmbeddingsResponse
from .... schema import Error, Value
from .... schema import Error, Term, IRI, LITERAL
from .... base import GraphEmbeddingsQueryService
# Module logger
@ -33,9 +33,9 @@ class Processor(GraphEmbeddingsQueryService):
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_graph_embeddings(self, msg):

View file

@ -12,7 +12,7 @@ from pinecone import Pinecone, ServerlessSpec
from pinecone.grpc import PineconeGRPC, GRPCClientConfig
from .... schema import GraphEmbeddingsResponse
from .... schema import Error, Value
from .... schema import Error, Term, IRI, LITERAL
from .... base import GraphEmbeddingsQueryService
# Module logger
@ -51,9 +51,9 @@ class Processor(GraphEmbeddingsQueryService):
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_graph_embeddings(self, msg):

View file

@ -11,7 +11,7 @@ from qdrant_client.models import PointStruct
from qdrant_client.models import Distance, VectorParams
from .... schema import GraphEmbeddingsResponse
from .... schema import Error, Value
from .... schema import Error, Term, IRI, LITERAL
from .... base import GraphEmbeddingsQueryService
# Module logger
@ -67,9 +67,9 @@ class Processor(GraphEmbeddingsQueryService):
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_graph_embeddings(self, msg):

View file

@ -1,14 +1,14 @@
"""
Triples query service. Input is a (s, p, o) triple, some values may be
null. Output is a list of triples.
Triples query service. Input is a (s, p, o, g) quad pattern, some values may be
null. Output is a list of quads.
"""
import logging
from .... direct.cassandra_kg import KnowledgeGraph
from .... direct.cassandra_kg import KnowledgeGraph, GRAPH_WILDCARD, DEFAULT_GRAPH
from .... schema import TriplesQueryRequest, TriplesQueryResponse, Error
from .... schema import Value, Triple
from .... schema import Term, Triple, IRI, LITERAL
from .... base import TriplesQueryService
from .... base.cassandra_config import add_cassandra_args, resolve_cassandra_config
@ -18,6 +18,27 @@ logger = logging.getLogger(__name__)
default_ident = "triples-query"
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:
# For blank nodes or other types, use id or value
return term.id or term.value
def create_term(value):
"""Create a Term from a string value"""
if value.startswith("http://") or value.startswith("https://"):
return Term(type=IRI, iri=value)
else:
return Term(type=LITERAL, value=value)
class Processor(TriplesQueryService):
def __init__(self, **params):
@ -46,12 +67,6 @@ class Processor(TriplesQueryService):
self.cassandra_password = password
self.table = None
def create_value(self, ent):
if ent.startswith("http://") or ent.startswith("https://"):
return Value(value=ent, is_uri=True)
else:
return Value(value=ent, is_uri=False)
async def query_triples(self, query):
try:
@ -72,77 +87,103 @@ class Processor(TriplesQueryService):
)
self.table = user
triples = []
# Extract values from query
s_val = get_term_value(query.s)
p_val = get_term_value(query.p)
o_val = get_term_value(query.o)
g_val = query.g # Already a string or None
if query.s is not None:
if query.p is not None:
if query.o is not None:
quads = []
# Route to appropriate query method based on which fields are specified
if s_val is not None:
if p_val is not None:
if o_val is not None:
# SPO specified - find matching graphs
resp = self.tg.get_spo(
query.collection, query.s.value, query.p.value, query.o.value,
query.collection, s_val, p_val, o_val, g=g_val,
limit=query.limit
)
triples.append((query.s.value, query.p.value, query.o.value))
for t in resp:
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((s_val, p_val, o_val, g))
else:
# SP specified
resp = self.tg.get_sp(
query.collection, query.s.value, query.p.value,
query.collection, s_val, p_val, g=g_val,
limit=query.limit
)
for t in resp:
triples.append((query.s.value, query.p.value, t.o))
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((s_val, p_val, t.o, g))
else:
if query.o is not None:
if o_val is not None:
# SO specified
resp = self.tg.get_os(
query.collection, query.o.value, query.s.value,
query.collection, o_val, s_val, g=g_val,
limit=query.limit
)
for t in resp:
triples.append((query.s.value, t.p, query.o.value))
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((s_val, t.p, o_val, g))
else:
# S only
resp = self.tg.get_s(
query.collection, query.s.value,
query.collection, s_val, g=g_val,
limit=query.limit
)
for t in resp:
triples.append((query.s.value, t.p, t.o))
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((s_val, t.p, t.o, g))
else:
if query.p is not None:
if query.o is not None:
if p_val is not None:
if o_val is not None:
# PO specified
resp = self.tg.get_po(
query.collection, query.p.value, query.o.value,
query.collection, p_val, o_val, g=g_val,
limit=query.limit
)
for t in resp:
triples.append((t.s, query.p.value, query.o.value))
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((t.s, p_val, o_val, g))
else:
# P only
resp = self.tg.get_p(
query.collection, query.p.value,
query.collection, p_val, g=g_val,
limit=query.limit
)
for t in resp:
triples.append((t.s, query.p.value, t.o))
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((t.s, p_val, t.o, g))
else:
if query.o is not None:
if o_val is not None:
# O only
resp = self.tg.get_o(
query.collection, query.o.value,
query.collection, o_val, g=g_val,
limit=query.limit
)
for t in resp:
triples.append((t.s, t.p, query.o.value))
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((t.s, t.p, o_val, g))
else:
# Nothing specified - get all
resp = self.tg.get_all(
query.collection,
limit=query.limit
)
for t in resp:
triples.append((t.s, t.p, t.o))
g = t.g if hasattr(t, 'g') else DEFAULT_GRAPH
quads.append((t.s, t.p, t.o, g))
# Convert to Triple objects (with g field)
triples = [
Triple(
s=self.create_value(t[0]),
p=self.create_value(t[1]),
o=self.create_value(t[2])
s=create_term(q[0]),
p=create_term(q[1]),
o=create_term(q[2]),
g=q[3] if q[3] != DEFAULT_GRAPH else None
)
for t in triples
for q in quads
]
return triples
@ -162,4 +203,3 @@ class Processor(TriplesQueryService):
def run():
Processor.launch(default_ident, __doc__)

View file

@ -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:

View file

@ -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:

View file

@ -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: