Introduction
This document lists all changes in the most recent major release, which is 7.2.0.
See here for links to release notes for recent earlier versions.
Change History repeats the list of user-visible modifications for this release and includes similar lists for all earlier releases.
Release 7.2.0
Release 7.2.0 is a major release with important new features.
Support for AllegroGraph VMs on Azure. See Azure and AllegroGraph.
Support for Turtle*, and TriG* file formats; support for SPARQL*, and RDF*. Files written in Turtle* and TriG* can be loaded into AllegroGraph using agtool load or other loading tools. Embedded data in Turtle* files will be converted to normal triples, using the triple id as the subject of these additional triples. Note that Turtle* data cannot be exported in Turtle* format. Support for Turtle* was also in versions 7.1.x but the draft specification has changed since that release and this version implements the current draft standard. Note however that SPARQL Update queries (DELETE DATA, INSERT DATA, INSERT/DELETE) as well as SPARQL CONSTRUCT queries that contain RDF* patterns are not supported. If attempted, a warning will be issued and False returned.
The new 'agtool auto optimize' tool allows setting up regular automatic index optimization. See agtool auto optimize for details. If triples are regularly added and/or deleted from a repository, then the associated indices become less and less efficient. Such indices should be optimized regularly and there have been tools for doing this, but those tools each had certain limitations. The new automatic tool should work without these limitations. The tool can be enabled with agtool (see agtool auto optimize), or AGWebView.
agtool vload will load triples generated from a relational database. Ontop is a program that treats a relational database as if it were an RDF graph. It can materialize the data into RDF triples. The agtool vload command will trigger Ontop to materialize a relational database and then load the triples into AllegroGraph. See the Creating Virtualized Graphs document for more information. Also see agtool.
New Query Optimization Options: The supplemental Path Expression optimized query engine we have termed MJQE, first released in version 7.1.x, has been further enhanced in this release. With the release of our FedShard capabilities and parallel SPARQL, our on-going product research found an approach that can significantly improve certain Path Expression queries across shards. AllegroGraph’s MJQE caching methods and merge join operations provide optimizations to AllegroGraph’s highly scalable, parallel distributed query approach that is offered via the FedShard capabilities.
See the SPARQL Query Engines document for more information and instructions on how to specify that MJQE should be used in a query but in short add the following Franz option to your query to use MJQE:
PREFIX franzOption_engine: <franz:mjqe>
Namespace management rationalized and interface improved. The new agtool namespaces command can be used to list, add, and remove namespace prefixes. Namespaces are now organized into default namespaces (seen by all users in all repositories), repository namespaces (seen by all users of a specific repo), and user namespaces (seen by a specific user on a specific repository). See the Namespaces and query options document for more information.
Query option management. The new agtool query-options command can be used to list, add, and remove query options that will be used for queries. Query options are now organized into default options (used by all queries in all repositories), repository options (used by all queries on a specific repository), and and user options (used for queries posed by a specific user on a specific repository). There are no pre-defined default, repo, or user query options. See the Namespaces and query options document for more information.
Database internal format is unchanged from version the previous version (7.1.x)
Release 6.4.6 had a different internal format. All releases since then have the same internal format. This means version 6.5.0 through 7.1.0 repositories can be directly loaded into version 7.2.0 without upgrading. Note that backing up repositories before loading them into a new version is always recommended. Once a database has been used in a later release, it cannot be used in an earlier release regardless of whether or not the database format is the same. Upgrading is discussed in the Repository Upgrading document.
Version 7.2.0 Admin notes
This sections notes changes which may affect AllegroGraph administration, which includes managing users, dealing with passwords, and so on.
- The new agtool auto optimize tool, described above, allows setting up regular automatic index optimization. The tool can be enabled with agtool (see agtool auto optimize), or AGWebView.
Version 7.2.0 Programmer notes
This section notes changes which may affect how certain code or operations work compared to earlier releases. These are emphasized here because the changes may be unexpected. The complete list of user-visible changes below also mentions these changes in a shorter format.
Session Control: Sessions are a tool for creating complex federated repositories, with reasoning and graph filtering applied to the individual repositories of the federation. You can also start a session with just the currently open repo. In earlier releases, sessions could only be created in AGWebView by displaying the Session page with the Utilities | Sessions menu command. And then on a session repo page, there would be a sessions menu with controls like Commit, Rollback, and Close. This has changed in 7.2.0. There is still a Utilities | Sessions menu command which displays the Session page but now there is a Session field on repository overview pages. And on repository overview pages for sessions, the available commands are shown in the Session field rather then in an additonal menu. See the section Session Specifications in the AGWebView document for more information.
SPARQL 1.1 incompatibly changed the definition of a DECIMAL from
DECIMAL ::= [0-9]+ '.' [0-9]* | '.' [0-9]+
to
DECIMAL ::= [0-9]* '.' [0-9]+
As a result a digit must appear after a decimal point, so 1.
, read in SPARQL 1.0 as 1.0
but as the integer 1 followed by an unconnected peiod in SPARQL 1.1. AllegroGraph now is compliant with SPARQL 1.1. This is an incompatible change from earlier releases.
For example this query
SELECT ?s ?p ?o
{
?s ?p ?o.
?s ?p 1.
}
previously might cause the response unknownConstants There are no triples with object: '1.0'
but now the period is read as a pattern-terminating period. The SPARQL 1.0 rule is specified here and the changed SPARQL 1.1 rule is here.
There are significant additions to the Query page in AGWebView. You can now add query options and specify the query engine. See the New Query Page section of the WebView document for more information.
The set of default triple indices has been modified: gospi
has been taken out, and psogi
has been added. This change in combination with improvements in the query engine will lead to better query performance for most queries.
Version 7.2.0 user visible changes
This section lists changes in the current release. See the Change History for a list of changes in all earlier releases.
AllegroGraph Server: General Changes
Some TopBraid Composer (TBC) examples no longer work
The document TopBraid Composer Plugin has examples showing how you can connect TBC to an AllegroGraph repository and then directly add triples created by TBC. This worked by using the Sesame2 Remote Repository export format from TBC. Recent versions of TBC (which is now at version 7.x) no longer support that format. To copy triples from TBC to AllegroGraph you must save the triples to a file and load the file into AllegroGraph. The TopBraid Composer Plugin document has been updated to not this change.
New agtool vload command loads materialized triples from a relational database
See agtool and the Creating Virtualized Graphs document for more information. There is an example using the Ontop utility.
New data streaming example
See Graph streaming for an example connecting AllegroGraph a data streaming tool such as Apache Kafka.
New example using Apache Spark
An example of graph analytics using AllegroGraph and Apache Spark can be found here in the franzinc/agraph-examples repo. See the Examples on Github document, which includes examples using Apache Spark, Apache Kafka, Kubernetes, Terraform, load balancing with NGINX, and so on.
New agtool commands query-options and namespaces
The command agtool query-options can be used to add, remove, and list default query options for the user and repo specified in the command line. The command agtool namespaces can be used to add, remove, and list default user namespaces for the user and repo specified in the command line.
New --port and --sslport control options to agraph-control
The agraph-control program now accept --port
and --sslport
control options, which, if specified, override the values specified for Port
and SSLPort
in the AllegroGraph configuration file (usually named agraph.cfg). This is convenient if the values specified in the configuration file are already in use. The agraph-control is documented here in the Server Configuration and Control document. The associated agraph also now accepts --port
and --sslport
arguments.
Handling of numbers in JSON-LD code fixed
Things that looked like numbers in JSON-LD code, including the string ".", were converted to typed numbers, even when that was not wanted. Strings "true" and "false" were also always converted to booleans. This has been fixed. Conversion is now performed only when the appropriate datatype is explicitly specified.
New storage-report option to agtool
The tool shows storage used by a repository. See here in the agtool General Command Utility document. The report includes, along with other information, the percentage of triples stored but deleted.
The Table in the Cluster Managment page modified
The table is illustrated in the Multi-master Replication document. The table now shows the host and port of each instance.
The maximum number of unique strings has increased
From 2^32 to 2^39. (The hash table in shared memory used for locating strings doubled in size.)
Rfe16711 - implement query-results-limit
user access flag
Users can now be restricted to a maximum number of results from a query. See Limiting results of a query in SPARQL Reference and Limiting the results a user can see in Managing Users. Also see the new QueryResultsLimit configuration directive.
Rfe16709 - XML 1.1 support for rdf serializer
Make RDF serializer output XML 1.1 by default. Previously AllegroGraph wrote version 1.0 XML which is unable to express all of the characters you might find in repository data. The new XMLVersion configuration option can be used to revert back to XML 1.0 if needed.
Rfe16691 - New agtool for automating repository optimization
See the Release Notes description. Also see agtool auto optimize, or AGWebView.
Rfe16639 - Rename agtool command token
to tokens
for consistency
The agtool command tree token
has been renamed to tokens
for consistency with other similar commands. The old token
name will still work to ensure backward compatibility but it is deprecated and excluded from the help text.
Rfe16562: Support limiting agtool query
output to results only
The output of agtool query
can now be limited to results only by specifying the --quiet
option. When --quiet
is set, all log output will be written to the agquery.log
file. See agtool query for more information.
Rfe16540 - Add support for creating, deleting, and listing repos and dynamic catalogs with agtool
agtool has new repos and catalogs tools. They can be used, respectively, to create and delete repos (including replicated repos) and dynamic catalogs. The tools can also list existing repos and catalogs. See the agtool document for more information.
Bug26575 - SHACL implicit class targets only worked for rdfs:Class
If a shape is also declared to be a class in the shapes graph then all SHACL instances of this class are a target for the shape (see the SHACL spec here). This only worked if the shape had a rdfs:Class
type and failed if it was a subclass of rdfs:Class
e.g. owl:Class
. This has been fixed.
Bug26473 - Decimal production in SPARQL 1.1
DECIMAL production now uses the SPARQL 1.1 definition, meaning that at least one digit after the dot is required. Previously 1.
was read as the DECIMAL 1.0
, instead of being correctly read as the integer 1
followed by a period, just like
1 .
This is an incompatible change. The SPARQL 1.0 rule is specified here and the changed SPARQL 1.1 rule is here.
Bug26414: Fix default query memory limit initialization
Default query memory was incorrectly initialized to the 13.3 GB instead of 85% of available system memory, as specified in the documentation. Because of this in some cases the users needed to increase the memory limit manually via the query option
PREFIX franzOption_memoryLimit: <franz:NEW_LIMIT>
where NEW_LIMIT is either a number (of bytes) or a value of the form <number><unit>
(e.g. 32G
). This has been fixed so default query memory will start at 85% of available system memory.
Bug26221 - Speedup Freetext Index (FTI) phrase match searches
Fixed an inefficiency in FTI phrase matches that caused a slowdown when a word in the phrase appeared in a single triple multiple times. This is now optimized. The speedup seen will vary based on the frequency in which a word from the phrase appears in a given triple. For small string literals and resources, the improvement will be very modest, but for phrase matches in large string literals the speedup can be significant
HTTP Client
No significant changes.
SPARQL
Rfe16530 - Add support for xsd:dateTime subtraction in SPARQL queries
Arithmetic operations in SPARQL's BIND clauses now support xsd:date
/xsd:time
/xsd:dateTime
subtraction that returns xsd:duration
values, i.e. query like
SELECT ?x
WHERE {
BIND (("2020-07-29T17:26:08Z"^^xsd:dateTime -
"2020-07-28T17:26:08Z"^^xsd:dateTime) AS ?x)
}
will return a value
"P1D"^^xsd:duration
Note that results of date/time subtraction are restricted to xsd:dateTimeDuration
subset of xsd:duration
values for simplicity reasons.
Rfe16528 - Remove reorderDuringExecution query option
In practice the pattern estimates are good enough to not have to consider reordering. Using the special query prefix:
PREFIX franzOption_reorderDuringExecution: <franz:yes>
will now give a query warning:
obsoleteQueryOption: reorderDuringExecution
Rfe16510 - Support for SPARQL*
AllegrGraph now supports queries that use the SPARQL* syntax, like:
select * {
<< ?s ?p ?o >> <ex:key> ?value
}
select * {
bind( << ?s <ex:pred> ?o >> as ?triple )
}
A reified triple is represented as an IRI that looks like: <http://franz.com/ns/allegrograph/4.0/tripleId#123>
which means isIRI(?triple)
will return true for reified triples.
There is a new SPARQL filter function: isTriple(?triple)
that returns true only if ?triple
is a reified triple.
SPARQL* queries are not yet supported on federated or distributed repositories.
Rfe16504: Remove "enableDuplicateReduction" query option
The SPARQL query option enableDuplicateReduction
, if set to true
, would behave somewhat like specifying reduced
. In all cases where it would be relevant to enable this reduction, it is better to specify reduced
or distinct
in the query. Therefore the setting is removed.
Usage of the franzOption_enableDuplicateReduction
query prefix will now lead to a warn-obsolete-query-option
entry in the query result metadata:
(run-sparql "PREFIX franzOption_enableDuplicateReduction: <franz:yes>
select ...")
has fourth return value:
#<done
[warn] obsolete-query-option: enableDuplicateReduction
[time] ...
...>
Bug26558 - Fix zero-length property paths with non-existent S/O parts
According to the SPARQL specification, assuming an empty data set, all of these queries should return the same single result :s1
:
# query 1
SELECT ?s {
?s :p1* :s1
}
# Query 2
SELECT ?s {
VALUES ?s { :s1 }
?s :p1* :s1.
}
# Query 3
SELECT ?s {
?s :p1* :s1.
FILTER (?s = :s1)
}
but only the first one returns the correct result, while all others return an empty result set because of a premature optimization. This has been fixed.
Bug26557 - Remove odd zero-length property paths matches on MJQE
MJQE used to return additional results for zero length paths when either subject or object of the pattern was fixed. For example, for the data set
:s1 :p1 [ :p2 :o1 ].
:s2 :p3 :o2.
the query
SELECT ?o {
VALUES ?o { :o2 }
:s2 (:p1|:p2)* ?o
}
returned
-------
| o |
=======
| :s2 |
-------
which is only correct when the object of the pattern is not fixed. This has been resolved.
Bug26532 - Query canceling does not work for queries run on MJQE
It was impossible to cancel a query that was being executed on MJQE because of the incorrect job initialization. For example, pressing the Cancel
button in WebView had no effect on the MJQE query currently in progress. This has been fixed.
Bug26531 - Fix total query time reporting for queries run via HTTP
When running SPARQL queries through HTTP endpoint (for example, in WebView), the query information sent in x-query-final-info
trailer contained incorrect total query time that was approximately twice as big as the real total time. This has been fixed.
Bug26525 - Format selection fails for CONSTRUCT queries run with agtool
When executing queries with agtool query, the --results-format
argument was not working properly for DESCRIBE
and CONSTRUCT
queries with the keywords in upper case. This has been fixed.
Bug26515 - Restore reorderDuringExecution
query option
The option was removed in v7.1.0 but has now been restored. See Query execution options in the SPARQL Reference document.
Bug26493 - Queries with magic properties may return less results
It was possible for some queries with magic properties and fixed values to return less results because of an incorrect optimization, For example, for the following dataset
@prefix : <http://example.org#>.
:alice :owns "Galaxy Note".
:bob :owns "Galaxy Note".
the following query
PREFIX : <http://example.org#>
PREFIX fti: <http://franz.com/ns/allegrograph/2.2/textindex/>
SELECT ?p ?o WHERE {
(:bob ?o ?p) fti:match "galaxy".
}
will return an empty result, while the query without the fixed constant
PREFIX : <http://example.org#>
SELECT ?s ?p ?o WHERE {
(?s ?o ?p) fti:match "galaxy".
}
returns both results, as expected:
--------------------------------
| s | p | o |
================================
| :alice | :owns | Galaxy Note |
| :bob | :owns | Galaxy Note |
--------------------------------
This has been fixed.
Bug26460: Empty RDF graph was returned by SPARQL's DESCRIBE * WHERE ...
The following two SPARQL queries are expected to be equivalent
DESCRIBE * WHERE { ?s ?p ?o . }
DESCRIBE ?s ?p ?o WHERE { ?s ?p ?o . }
but the first one (with the wildcard *
) used to return an empty result. This has been fixed.
Bug26452 - MJQE may omit bindings introduced by SPARQL VALUES
clause
When more then one variable in a pattern has bindings introduced by the VALUES
clause, MJQE engine may omit the bindings for one of the variables.
For example, assuming the data
:a :p1 :b.
:a :p2 :c.
:b :p2 :c.
the following query
SELECT ?s ?p ?o WHERE {
VALUES ?s { :a }
VALUES ?p { :p1 :p2 }
?s ?p ?o.
}
used to return the following result
------------------
| s | p | o |
==================
| --- | :p1 | :b |
| --- | :p2 | :c |
------------------
when run on MJQE. This has been fixed.
Bug26451 - Fix occasional errors in queries on security-filtered stores
When security filters were used, it was possible for some queries to fail with an error message of the form
QUERY FAILED: `#<db.agraph.cursor::filtered-cursor ...>' is not
of the expected type `number'
indicating an internal type error. This has been fixed.
Bug26436 - Fix missing results for multiple property path matches
In cases when there are multiple zero-or-more paths between the subject and object in the restricted pattern, the query engine used to drop the result with multiple paths, for example for the dataset
:s1 :p1 :o1.
:s2 :p1 :o1.
:s1 :p2 [ :p2 :o2 ].
:s2 :p3 [ :p2 :o2 ].
:s2 :p2 [ :p3 :o2 ].
the query
SELECT ?s {
# this restricts the pattern in FILTER EXISTS
?s :p1 :o1.
# this ends up return less results
FILTER EXISTS { ?s (:p2|:p3)* :o2 }
}
used to return only one result :s1
, while it should have returned :s1
, :s2
. This has been fixed.
Bug26333 - Property paths that join bindings may produce bogus results
It was possible for the SPARQL sequence property paths to produce too many results when joining bindings from VALUES clauses or subqueries. This has been fixed.
Bug26290 - Max when some variable is unbound, must give unbound result value
In AllegroGraph 6.7.0 a SPARQL regression was introduced, where SPARQL MAX aggregator would treat unbound values as bound values (lowest in ordering) and so return a bound value as result.
This was incorrect: when aggregating over an unbound value, the aggregation result should be an unbound value due to a SPARQL type error in the aggregation.
This has been fixed, so that the aggregation result is the unbound value in the described case.
Bug26282 - Stack overflow during OPTIONAL query planning
Certain queries containing an OPTIONAL clause could lead to an error ("stack overflow") during query planning. This is now fixed.
Bug26260 - Fix spurious "emptyBindClause" query warnings
SPARQL queries with a BIND clause at the start of a BGP could generate a spurious "emptyBindClause" warnings saying:
The BINDING form for ?val cannot succeed
This can be an incorrect warning if the BIND expression does a special operation that can deal with unbound variables, like BOUND, COALESCE, IN or IF.
Examples:
select * {
bind(bound(?o) as ?val) .
}
-> ?val = false
select * {
bind(coalesce(?o,1,2) as ?val) .
}
-> val = 1
This is now fixed so that no spurious warnings are generated.
AGWebView
Bug26332: Broken bulk namespace input dialog in AGWV
The Add a namespace button in query editor shows a dialog that has a Bulk Input button which in turn should be showing a different dialog that allows to input multiple namespace declarations at once. This dialog was broken and an empty dialog box was shown instead. This has been fixed. See the New Query Page section of the WebView document for more information on the Add a namespace button.
Changes to the Lisp API
No significant changes.
Prolog
No significant changes.
Documentation
There is a new AllegroGraph examples document.
This document has links to example locations, either part of the distribution or on our franzinc/agraph-examples repo on Github.
Distributed AllegroGraph
No significant changes.
User-visible changes in earlier releases
See Recent Version Release Notes for changes in recent release and Change History for user-visible changes to all earlier releases.