Details
-
Question
-
Status: Closed
-
Major
-
Resolution: Information Provided
-
Jena 4.2.0
-
None
-
None
Description
Hello,
If you try to put a triple into a TDB2 with a literal in the subject position you get the following:
ERROR riot :: [line: 6, col: 18] Subject is not a URI or blank node
So far so good.
But since literals can not be in the subject position of a triple then a query against a TDB2 should never attempt to find a literal in the subject position of a triple, right? It would be a waste of time.
But if I am reading the logs correctly that is what appears to happen:
root@ec6206bb523f:/mnt/tdb_42# cat /mnt/z.ttl @prefix ex: <[http://example.com/]> . ex:apple ex:hasPart ex:skin . ex:skin ex:hasName "Skin" . ex:file ex:hasPart "lala" . root@ec6206bb523f:/mnt/tdb_42# root@ec6206bb523f:/mnt/tdb_42# cat /mnt/z.rq prefix ex: <[http://example.com/]> select * where { ?s ex:hasPart ?o . optional \\{ ?o ?p ?o1 . } } root@ec6206bb523f:/mnt/tdb_42# /mnt/apache-jena-4.2.0/bin/tdb2.tdbloader --loc=`pwd` /mnt/z.ttl 00:31:49 INFO loader :: Loader = LoaderPhased 00:31:49 INFO loader :: Start: /mnt/z.ttl 00:31:49 INFO loader :: Finished: /mnt/z.ttl: 3 tuples in 0.07s (Avg: 40) 00:31:49 INFO loader :: Finish - index SPO 00:31:49 INFO loader :: Start replay index SPO 00:31:49 INFO loader :: Index set: SPO => SPO->POS, SPO->OSP 00:31:49 INFO loader :: Index set: SPO => SPO->POS, SPO->OSP [3 items, 0.0 seconds] 00:31:49 INFO loader :: Finish - index OSP 00:31:49 INFO loader :: Finish - index POS root@ec6206bb523f:/mnt/tdb_42# /mnt/apache-jena-4.2.0/bin/tdb2.tdbquery -v --loc=`pwd` --query=/mnt/z.rq 1 PREFIX ex: <[http://example.com/]> 2 3 SELECT * 4 WHERE 5 { ?s ex:hasPart ?o 6 OPTIONAL 7 { ?o ?p ?o1 } 8 } 00:31:59 INFO exec :: QUERY PREFIX ex: <[http://example.com/]> SELECT * WHERE { ?s ex:hasPart ?o OPTIONAL { ?o ?p ?o1 } } 00:31:59 INFO exec :: ALGEBRA (conditional (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s <[http://example.com/hasPart]> ?o)) (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?o ?p ?o1))) 00:32:00 INFO exec :: TDB (conditional (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s <[http://example.com/hasPart]> ?o)) (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?o ?p ?o1))) 00:32:00 INFO exec :: Execute :: ?s <[http://example.com/hasPart]> ?o 00:32:00 INFO exec :: TDB (quadpattern (quad <urn:x-arq:DefaultGraphNode> <[http://example.com/skin]> ?p ?o1)) 00:32:00 INFO exec :: Execute :: <[http://example.com/skin]> ?p ?o1 00:32:00 INFO exec :: TDB (quadpattern (quad <urn:x-arq:DefaultGraphNode> "lala" ?p ?o1)) 00:32:00 INFO exec :: Execute :: "lala" ?p ?o1 -------------------------------------------- |s|o|p|o1| ============================================ |ex:apple|ex:skin|ex:hasName|"Skin"| |ex:file|"lala"| | | --------------------------------------------
Doesn't this:
00:32:00 INFO exec :: TDB (quadpattern (quad <urn:x-arq:DefaultGraphNode> "lala" ?p ?o1)) 00:32:00 INFO exec :: Execute :: "lala" ?p ?o1
mean a lookup was done in the TDB2 for a triple with the literal "lala" in the subject position? If so, shouldn't lookups like that be ignored as they will never find matching triples in the TDB2?