diff --git a/composer.json b/composer.json
index 63b08d9a2d45392bb6c67e03db1a500e9880b037..8da852da9288c8c13a8ff3a4da3d6edbb96c16a7 100644
--- a/composer.json
+++ b/composer.json
@@ -33,7 +33,7 @@
         "symfony/lock": "^4.4",
         "symfony/browser-kit": "^4.4",
         "symfony/dom-crawler": "^4.4 !=4.4.5",
-        "easyrdf/easyrdf": "^0.9"
+        "easyrdf/easyrdf": "^0.9 || ^1.0"
     },
     "replace": {
         "paragonie/random_compat": "9.99.99",
diff --git a/composer.lock b/composer.lock
index 648712d1c2bdb38e2f2e1e34e4cefa87785b7170..7654dfbdb221db6a990331224243101d40c26bc2 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "8877ebb73b0fca58e145989738ba04b4",
+    "content-hash": "059e8aee61edb73b1526b840eb6c624c",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -4805,35 +4805,39 @@
         },
         {
             "name": "easyrdf/easyrdf",
-            "version": "0.9.1",
+            "version": "1.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/easyrdf/easyrdf.git",
-                "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566"
+                "reference": "8735708426066b791c2a6d40329050d5cf31385c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/easyrdf/easyrdf/zipball/acd09dfe0555fbcfa254291e433c45fdd4652566",
-                "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566",
+                "url": "https://api.github.com/repos/easyrdf/easyrdf/zipball/8735708426066b791c2a6d40329050d5cf31385c",
+                "reference": "8735708426066b791c2a6d40329050d5cf31385c",
                 "shasum": ""
             },
             "require": {
                 "ext-mbstring": "*",
                 "ext-pcre": "*",
-                "php": ">=5.2.8"
+                "php": ">=7.1.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~3.5",
-                "sami/sami": "~1.4",
-                "squizlabs/php_codesniffer": "~1.4.3"
+                "ml/json-ld": "~1.0",
+                "phpunit/phpunit": "^7",
+                "sami/sami": "^4",
+                "semsol/arc2": "~2.2",
+                "squizlabs/php_codesniffer": "3.*",
+                "zendframework/zend-http": "~2.3"
             },
             "suggest": {
-                "ml/json-ld": "~1.0"
+                "ml/json-ld": "~1.0",
+                "semsol/arc2": "~2.2"
             },
             "type": "library",
             "autoload": {
-                "psr-0": {
-                    "EasyRdf_": "lib/"
+                "psr-4": {
+                    "EasyRdf\\": "lib"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -4850,6 +4854,7 @@
                 {
                     "name": "Alexey Zakhlestin",
                     "email": "indeyets@gmail.com",
+                    "homepage": "http://indeyets.ru/",
                     "role": "Developer"
                 }
             ],
@@ -4863,7 +4868,12 @@
                 "rdfa",
                 "sparql"
             ],
-            "time": "2015-02-27T09:45:49+00:00"
+            "support": {
+                "forum": "http://groups.google.com/group/easyrdf/",
+                "issues": "http://github.com/easyrdf/easyrdf/issues",
+                "source": "https://github.com/easyrdf/easyrdf/tree/master"
+            },
+            "time": "2020-07-14T23:45:20+00:00"
         },
         {
             "name": "fabpot/goutte",
diff --git a/composer/Metapackage/DevDependencies/composer.json b/composer/Metapackage/DevDependencies/composer.json
index 3c107300090c2fbad10e835bfb9c24ee31928466..b6de7308ab55b9eccf565d35674c9a726befb382 100644
--- a/composer/Metapackage/DevDependencies/composer.json
+++ b/composer/Metapackage/DevDependencies/composer.json
@@ -12,7 +12,7 @@
         "behat/mink-selenium2-driver": "^1.4",
         "composer/composer": "^1.9.1",
         "drupal/coder": "^8.3.7",
-        "easyrdf/easyrdf": "^0.9",
+        "easyrdf/easyrdf": "^0.9 || ^1.0",
         "justinrainbow/json-schema": "^5.2",
         "mikey179/vfsstream": "^1.6.8",
         "phpspec/prophecy": "^1.7",
diff --git a/composer/Metapackage/PinnedDevDependencies/composer.json b/composer/Metapackage/PinnedDevDependencies/composer.json
index d49579d3d2ba61774b18f29d9e88848073274b8b..d6cec67a878a5bd0ec46623fb251d894ba2c30d4 100644
--- a/composer/Metapackage/PinnedDevDependencies/composer.json
+++ b/composer/Metapackage/PinnedDevDependencies/composer.json
@@ -18,7 +18,7 @@
         "composer/xdebug-handler": "1.4.3",
         "doctrine/instantiator": "1.3.1",
         "drupal/coder": "8.3.9",
-        "easyrdf/easyrdf": "0.9.1",
+        "easyrdf/easyrdf": "1.0.0",
         "fabpot/goutte": "v3.3.0",
         "instaclick/php-webdriver": "1.4.7",
         "justinrainbow/json-schema": "5.2.10",
diff --git a/core/modules/rdf/tests/src/Traits/EasyRdf_ParsedUri.php b/core/modules/rdf/tests/src/Traits/EasyRdf_ParsedUri.php
deleted file mode 100644
index e433d46bfb008d9ab877376ec9d74764451c70ee..0000000000000000000000000000000000000000
--- a/core/modules/rdf/tests/src/Traits/EasyRdf_ParsedUri.php
+++ /dev/null
@@ -1,352 +0,0 @@
-<?php
-// @codingStandardsIgnoreFile
-
-namespace Drupal\Tests\rdf\Traits;
-
-/**
- * This is copy of \EasyRdf_ParsedUri from the easyrdf/easyrdf library.
- *
- * It fixes a PHP 7.4 deprecation in \EasyRdf_ParsedUri::normalize().
- *
- * @todo https://www.drupal.org/project/drupal/issues/3110972 Remove this work
- *   around.
- */
-
-/**
- * EasyRdf
- *
- * LICENSE
- *
- * Copyright (c) 2009-2013 Nicholas J Humfrey.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author 'Nicholas J Humfrey" may be used to endorse or
- *    promote products derived from this software without specific prior
- *    written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package    EasyRdf
- * @copyright  Copyright (c) 2009-2013 Nicholas J Humfrey
- * @license    http://www.opensource.org/licenses/bsd-license.php
- */
-
-
-/**
- * A RFC3986 compliant URI parser
- *
- * @package    EasyRdf
- * @copyright  Copyright (c) 2009-2013 Nicholas J Humfrey
- * @license    http://www.opensource.org/licenses/bsd-license.php
- * @link       http://www.ietf.org/rfc/rfc3986.txt
- */
-class EasyRdf_ParsedUri
-{
-    // For all URIs:
-    private $scheme = null;
-    private $fragment = null;
-
-    // For hierarchical URIs:
-    private $authority = null;
-    private $path = null;
-    private $query = null;
-
-    const URI_REGEX = "|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|";
-
-    /** Constructor for creating a new parsed URI
-     *
-     * The $uri parameter can either be a string or an
-     * associative array with the following keys:
-     * scheme, authority, path, query, fragment
-     *
-     * @param  mixed $uri  The URI as a string or an array
-     * @return object EasyRdf_ParsedUri
-     */
-    public function __construct($uri = null)
-    {
-        if (is_string($uri)) {
-            if (preg_match(self::URI_REGEX, $uri, $matches)) {
-                if (!empty($matches[1])) {
-                    $this->scheme = isset($matches[2]) ? $matches[2] : '';
-                }
-                if (!empty($matches[3])) {
-                    $this->authority = isset($matches[4]) ? $matches[4] : '';
-                }
-                $this->path = isset($matches[5]) ? $matches[5] : '';
-                if (!empty($matches[6])) {
-                    $this->query = isset($matches[7]) ? $matches[7] : '';
-                }
-                if (!empty($matches[8])) {
-                    $this->fragment = isset($matches[9]) ? $matches[9] : '';
-                }
-            }
-        } elseif (is_array($uri)) {
-            $this->scheme = isset($uri['scheme']) ? $uri['scheme'] : null;
-            $this->authority = isset($uri['authority']) ? $uri['authority'] : null;
-            $this->path = isset($uri['path']) ? $uri['path'] : null;
-            $this->query = isset($uri['query']) ? $uri['query'] : null;
-            $this->fragment = isset($uri['fragment']) ? $uri['fragment'] : null;
-        }
-    }
-
-
-    /** Returns true if this is an absolute (complete) URI
-     * @return boolean
-     */
-    public function isAbsolute()
-    {
-        return $this->scheme !== null;
-    }
-
-    /** Returns true if this is an relative (partial) URI
-     * @return boolean
-     */
-    public function isRelative()
-    {
-        return $this->scheme === null;
-    }
-
-    /** Returns the scheme of the URI (e.g. http)
-     * @return string
-     */
-    public function getScheme()
-    {
-        return $this->scheme;
-    }
-
-    /** Sets the scheme of the URI (e.g. http)
-     * @param string $scheme The new value for the scheme of the URI
-     */
-    public function setScheme($scheme)
-    {
-        $this->scheme = $scheme;
-    }
-
-    /** Returns the authority of the URI (e.g. www.example.com:8080)
-     * @return string
-     */
-    public function getAuthority()
-    {
-        return $this->authority;
-    }
-
-    /** Sets the authority of the URI (e.g. www.example.com:8080)
-     * @param string $authority The new value for the authority component of the URI
-     */
-    public function setAuthority($authority)
-    {
-        $this->authority = $authority;
-    }
-
-    /** Returns the path of the URI (e.g. /foo/bar)
-     * @return string
-     */
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    /** Set the path of the URI (e.g. /foo/bar)
-     * @param string $path The new value for the path component of the URI
-     */
-    public function setPath($path)
-    {
-        $this->path = $path;
-    }
-
-    /** Returns the query string part of the URI (e.g. foo=bar)
-     * @return string
-     */
-    public function getQuery()
-    {
-        return $this->query;
-    }
-
-    /** Set the query string of the URI (e.g. foo=bar)
-     * @param string $query The new value for the query string component of the URI
-     */
-    public function setQuery($query)
-    {
-        $this->query = $query;
-    }
-
-    /** Returns the fragment part of the URI (i.e. after the #)
-     * @return string
-     */
-    public function getFragment()
-    {
-        return $this->fragment;
-    }
-
-    /** Set the fragment of the URI (i.e. after the #)
-     * @param string $fragment The new value for the fragment component of the URI
-     */
-    public function setFragment($fragment)
-    {
-        $this->fragment = $fragment;
-    }
-
-
-    /**
-     * Normalizes the path of this URI if it has one. Normalizing a path means
-     * that any unnecessary '.' and '..' segments are removed. For example, the
-     * URI http://example.com/a/b/../c/./d would be normalized to
-     * http://example.com/a/c/d
-     *
-     * @return object EasyRdf_ParsedUri
-     */
-    public function normalize()
-    {
-        if (empty($this->path)) {
-            return $this;
-        }
-
-        // Remove ./ from the start
-        if (substr($this->path, 0, 2) == './') {
-            // Remove both characters
-            $this->path = substr($this->path, 2);
-        }
-
-        // Remove /. from the end
-        if (substr($this->path, -2) == '/.') {
-            // Remove only the last dot, not the slash!
-            $this->path = substr($this->path, 0, -1);
-        }
-
-        if (substr($this->path, -3) == '/..') {
-            $this->path .= '/';
-        }
-
-        // Split the path into its segments
-        $segments = explode('/', $this->path);
-        $newSegments = array();
-
-        // Remove all unnecessary '.' and '..' segments
-        foreach ($segments as $segment) {
-            if ($segment == '..') {
-                // Remove the previous part of the path
-                $count = count($newSegments);
-                if ($count > 0 && $newSegments[$count-1]) {
-                    array_pop($newSegments);
-                }
-            } elseif ($segment == '.') {
-                // Ignore
-                continue;
-            } else {
-                array_push($newSegments, $segment);
-            }
-        }
-
-        // Construct the new normalized path
-        $this->path = implode('/', $newSegments);
-
-        // Allow easy chaining of methods
-        return $this;
-    }
-
-    /**
-     * Resolves a relative URI using this URI as the base URI.
-     */
-    public function resolve($relUri)
-    {
-        // If it is a string, then convert it to a parsed object
-        if (is_string($relUri)) {
-            $relUri = new EasyRdf_ParsedUri($relUri);
-        }
-
-        // This code is based on the pseudocode in section 5.2.2 of RFC3986
-        $target = new EasyRdf_ParsedUri();
-        if ($relUri->scheme) {
-            $target->scheme = $relUri->scheme;
-            $target->authority = $relUri->authority;
-            $target->path = $relUri->path;
-            $target->query = $relUri->query;
-        } else {
-            if ($relUri->authority) {
-                $target->authority = $relUri->authority;
-                $target->path = $relUri->path;
-                $target->query = $relUri->query;
-            } else {
-                if (empty($relUri->path)) {
-                    $target->path = $this->path;
-                    if ($relUri->query) {
-                        $target->query = $relUri->query;
-                    } else {
-                        $target->query = $this->query;
-                    }
-                } else {
-                    if (substr($relUri->path, 0, 1) == '/') {
-                        $target->path = $relUri->path;
-                    } else {
-                        $path = $this->path;
-                        $lastSlash = strrpos($path, '/');
-                        if ($lastSlash !== false) {
-                            $path = substr($path, 0, $lastSlash + 1);
-                        } else {
-                            $path = '/';
-                        }
-
-                        $target->path .= $path . $relUri->path;
-                    }
-                    $target->query = $relUri->query;
-                }
-                $target->authority = $this->authority;
-            }
-            $target->scheme = $this->scheme;
-        }
-
-        $target->fragment = $relUri->fragment;
-
-        $target->normalize();
-
-        return $target;
-    }
-
-    /** Convert the parsed URI back into a string
-     *
-     * @return string The URI as a string
-     */
-    public function toString()
-    {
-        $str = '';
-        if ($this->scheme !== null) {
-            $str .= $this->scheme . ':';
-        }
-        if ($this->authority !== null) {
-            $str .= '//' . $this->authority;
-        }
-        $str .= $this->path;
-        if ($this->query !== null) {
-            $str .= '?' . $this->query;
-        }
-        if ($this->fragment !== null) {
-            $str .= '#' . $this->fragment;
-        }
-        return $str;
-    }
-
-    /** Magic method to convert the URI, when casted, back to a string
-     *
-     * @return string The URI as a string
-     */
-    public function __toString()
-    {
-        return $this->toString();
-    }
-}
diff --git a/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php b/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php
index 143e658323bf01c1dba34f496c3881ba733d79cd..92fd6aba7a688bb63b1b5889810ab206bd02484c 100644
--- a/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php
+++ b/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php
@@ -3,14 +3,8 @@
 namespace Drupal\Tests\rdf\Traits;
 
 use Drupal\Core\Url;
-
-/**
- * Override \EasyRdf_ParsedUri for PHP 7.4 compatibility.
- *
- * @todo https://www.drupal.org/project/drupal/issues/3110972 Remove this work
- *   around.
- */
-class_alias('\Drupal\Tests\rdf\Traits\EasyRdf_ParsedUri', '\EasyRdf_ParsedUri');
+use EasyRdf\Graph;
+use EasyRdf\Parser\Rdfa;
 
 /**
  * Defines a trait for parsing RDF properties from HTML.
@@ -39,10 +33,12 @@ trait RdfParsingTrait {
    *
    * @return bool
    *   TRUE if the property exists with the given value.
+   *
+   * @throws \EasyRdf\Exception
    */
   protected function hasRdfProperty($html, $base_uri, $resource, $property, array $value) {
-    $parser = new \EasyRdf_Parser_Rdfa();
-    $graph = new \EasyRdf_Graph();
+    $parser = $this->getInstanceParser();
+    $graph = $this->getInstanceGraph();
     $parser->parse($graph, $html, 'rdfa', $base_uri);
 
     return $graph->hasProperty($resource, $property, $value);
@@ -72,10 +68,12 @@ protected function hasRdfProperty($html, $base_uri, $resource, $property, array
    *
    * @return bool
    *   TRUE if the property exists with the given value.
+   *
+   * @throws \EasyRdf\Exception
    */
   protected function hasRdfChildProperty($html, $base_uri, $resource, $parent_property, string $child_property, array $value) {
-    $parser = new \EasyRdf_Parser_Rdfa();
-    $graph = new \EasyRdf_Graph();
+    $parser = $this->getInstanceParser();
+    $graph = $this->getInstanceGraph();
     $parser->parse($graph, $html, 'rdfa', $base_uri);
     $node = $graph->get($resource, $parent_property);
     return $graph->hasProperty($node, $child_property, $value);
@@ -93,10 +91,12 @@ protected function hasRdfChildProperty($html, $base_uri, $resource, $parent_prop
    *
    * @return int
    *   The number of resources of the provided type.
+   *
+   * @throws \EasyRdf\Exception
    */
   protected function getElementByRdfTypeCount(Url $url, $base_uri, $type) {
-    $parser = new \EasyRdf_Parser_Rdfa();
-    $graph = new \EasyRdf_Graph();
+    $parser = $this->getInstanceParser();
+    $graph = $this->getInstanceGraph();
     $parser->parse($graph, $this->drupalGet($url), 'rdfa', $base_uri);
     return count($graph->allOfType($type));
   }
@@ -113,10 +113,12 @@ protected function getElementByRdfTypeCount(Url $url, $base_uri, $type) {
    *
    * @return string|null
    *   The type of resource or NULL if the resource has no type.
+   *
+   * @throws \EasyRdf\Exception
    */
   protected function getElementRdfType(Url $url, $base_uri, $resource_uri) {
-    $parser = new \EasyRdf_Parser_Rdfa();
-    $graph = new \EasyRdf_Graph();
+    $parser = $this->getInstanceParser();
+    $graph = $this->getInstanceGraph();
     $parser->parse($graph, $this->drupalGet($url), 'rdfa', $base_uri);
     return $graph->type($resource_uri);
   }
@@ -135,12 +137,46 @@ protected function getElementRdfType(Url $url, $base_uri, $resource_uri) {
    *
    * @return bool
    *   TRUE if the given property is blank.
+   *
+   * @throws \EasyRdf\Exception
    */
   protected function rdfElementIsBlankNode($html, $base_uri, $resource_uri, $property) {
-    $parser = new \EasyRdf_Parser_Rdfa();
-    $graph = new \EasyRdf_Graph();
+    $parser = $this->getInstanceParser();
+    $graph = $this->getInstanceGraph();
     $parser->parse($graph, $html, 'rdfa', $base_uri);
     return $graph->get($resource_uri, $property)->isBnode();
   }
 
+  /**
+   * Gets a new instance of EasyRdf\Parser\Rdfa or EasyRdf_Parser_Rdfa.
+   *
+   * @return \EasyRdf\Parser\Rdfa|\EasyRdf_Parser_Rdfa
+   *   The instance.
+   *
+   * @todo Clean this up in drupal:10.0.0.
+   * @see https://www.drupal.org/node/3176468
+   */
+  private function getInstanceParser() {
+    if (class_exists('EasyRdf\Parser\Rdfa')) {
+      return new Rdfa();
+    }
+    return new \EasyRdf_Parser_Rdfa();
+  }
+
+  /**
+   * Gets a new instance of EasyRdf\Graph or EasyRdf_Graph.
+   *
+   * @return \EasyRdf\Graph|\EasyRdf_Graph
+   *   The instance.
+   *
+   * @todo Clean this up in drupal:10.0.0.
+   * @see https://www.drupal.org/node/3176468
+   */
+  private function getInstanceGraph() {
+    if (class_exists('EasyRdf\Graph')) {
+      return new Graph();
+    }
+    return new \EasyRdf_Graph();
+  }
+
 }