jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/258519 )

Change subject: RDF mapping for external identifiers
......................................................................


RDF mapping for external identifiers

Bug: T121274
Change-Id: I44a203bddfece0d275c31d089a1172ab71891dae
---
M repo/WikibaseRepo.datatypes.php
M repo/includes/Rdf/PropertyRdfBuilder.php
M repo/includes/Rdf/RdfVocabulary.php
A repo/includes/Rdf/Values/ExternalIdentifierRdfBuilder.php
M repo/tests/phpunit/data/maintenance/dumpRdf-out.txt
M repo/tests/phpunit/data/rdf/PropertyRdfBuilder/P2_all.nt
M repo/tests/phpunit/data/rdf/RdfBuilder/Q4_props.nt
M repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-entities.nt
M repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-redirect.nt
M repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-entities.nt
M repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-redirect.nt
M repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php
A repo/tests/phpunit/includes/Rdf/Values/ExternalIdentifierRdfBuilderTest.php
13 files changed, 219 insertions(+), 6 deletions(-)

Approvals:
  Ladsgroup: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/repo/WikibaseRepo.datatypes.php b/repo/WikibaseRepo.datatypes.php
index 2a3ea77..f71b329 100644
--- a/repo/WikibaseRepo.datatypes.php
+++ b/repo/WikibaseRepo.datatypes.php
@@ -30,6 +30,8 @@
 use ValueParsers\QuantityParser;
 use ValueParsers\StringParser;
 use ValueParsers\ValueParser;
+use Wikibase\Lib\Store\FieldPropertyInfoProvider;
+use Wikibase\Lib\Store\PropertyInfoStore;
 use Wikibase\Rdf\DedupeBag;
 use Wikibase\Rdf\EntityMentionListener;
 use Wikibase\Rdf\JulianDateTimeValueCleaner;
@@ -38,6 +40,7 @@
 use Wikibase\Rdf\Values\CommonsMediaRdfBuilder;
 use Wikibase\Rdf\Values\ComplexValueRdfHelper;
 use Wikibase\Rdf\Values\EntityIdRdfBuilder;
+use Wikibase\Rdf\Values\ExternalIdentifierRdfBuilder;
 use Wikibase\Rdf\Values\GlobeCoordinateRdfBuilder;
 use Wikibase\Rdf\Values\LiteralValueRdfBuilder;
 use Wikibase\Rdf\Values\MonolingualTextRdfBuilder;
@@ -300,7 +303,20 @@
                                $factory = 
WikibaseRepo::getDefaultSnakFormatterBuilders();
                                return 
$factory->newExternalIdentifierFormatter( $format, $options );
                        },
-                       // TODO: RDF mapping using canonical URI patterns
+                       'rdf-builder-factory-callback' => function (
+                               $mode,
+                               RdfVocabulary $vocab,
+                               RdfWriter $writer,
+                               EntityMentionListener $tracker,
+                               DedupeBag $dedupe
+                       ) {
+                               $repo = WikibaseRepo::getDefaultInstance();
+                               $uriPatternProvider = new 
FieldPropertyInfoProvider(
+                                       
$repo->getStore()->getPropertyInfoLookup(),
+                                       PropertyInfoStore::KEY_CANONICAL_URI
+                               );
+                               return new ExternalIdentifierRdfBuilder( 
$uriPatternProvider, $vocab );
+                       },
                ],
                'VT:wikibase-entityid' => [
                        'validator-factory-callback' => function() {
diff --git a/repo/includes/Rdf/PropertyRdfBuilder.php 
b/repo/includes/Rdf/PropertyRdfBuilder.php
index 30d97a7..c520417 100644
--- a/repo/includes/Rdf/PropertyRdfBuilder.php
+++ b/repo/includes/Rdf/PropertyRdfBuilder.php
@@ -39,6 +39,10 @@
         */
        private function writePropertyPredicates( $id, $isObjectProperty ) {
                $this->writer->say( RdfVocabulary::NS_ONTOLOGY, 'directClaim' 
)->is( RdfVocabulary::NSP_DIRECT_CLAIM, $id );
+               $this->writer->say( RdfVocabulary::NS_ONTOLOGY, 
'directClaimNormalized' )->is(
+                       RdfVocabulary::NSP_DIRECT_CLAIM_NORM,
+                       $id
+               );
                $this->writer->say( RdfVocabulary::NS_ONTOLOGY, 'claim' )->is( 
RdfVocabulary::NSP_CLAIM, $id );
                $this->writer->say( RdfVocabulary::NS_ONTOLOGY, 
'statementProperty' )->is( RdfVocabulary::NSP_CLAIM_STATEMENT, $id );
                $this->writer->say( RdfVocabulary::NS_ONTOLOGY, 
'statementValue' )->is( RdfVocabulary::NSP_CLAIM_VALUE, $id );
@@ -58,6 +62,7 @@
                $this->writer->about( RdfVocabulary::NSP_CLAIM_VALUE_NORM, $id 
)->a( 'owl', 'ObjectProperty' );
                $this->writer->about( RdfVocabulary::NSP_QUALIFIER_VALUE_NORM, 
$id )->a( 'owl', 'ObjectProperty' );
                $this->writer->about( RdfVocabulary::NSP_REFERENCE_VALUE_NORM, 
$id )->a( 'owl', 'ObjectProperty' );
+               $this->writer->about( RdfVocabulary::NSP_DIRECT_CLAIM_NORM, $id 
)->a( 'owl', 'ObjectProperty' );
                // Depending on property type
                if ( $isObjectProperty ) {
                        $datatype = 'ObjectProperty';
diff --git a/repo/includes/Rdf/RdfVocabulary.php 
b/repo/includes/Rdf/RdfVocabulary.php
index 6001af2..5e219db 100644
--- a/repo/includes/Rdf/RdfVocabulary.php
+++ b/repo/includes/Rdf/RdfVocabulary.php
@@ -29,6 +29,7 @@
        const NS_VALUE = 'wdv'; // value
        // Predicates
        const NSP_DIRECT_CLAIM = 'wdt'; // direct assertion entity -> value
+       const NSP_DIRECT_CLAIM_NORM = 'wdtn'; // direct assertion entity -> 
value, normalized
        const NSP_CLAIM = 'p'; // entity -> statement
        const NSP_CLAIM_STATEMENT = 'ps'; // statement -> simple value
        const NSP_CLAIM_VALUE = 'psv'; // statement -> deep value
@@ -89,6 +90,13 @@
                self::NSP_CLAIM_STATEMENT => self::NSP_CLAIM_VALUE_NORM,
                self::NSP_QUALIFIER => self::NSP_QUALIFIER_VALUE_NORM,
                self::NSP_REFERENCE => self::NSP_REFERENCE_VALUE_NORM,
+       ];
+       // Value properties for normalized values, including for direct claims
+       public static $normalizedPropertyValueNamespace = [
+               self::NSP_DIRECT_CLAIM => self::NSP_DIRECT_CLAIM_NORM,
+               self::NSP_CLAIM_STATEMENT => self::NSP_CLAIM_VALUE_NORM,
+               self::NSP_QUALIFIER => self::NSP_QUALIFIER_VALUE_NORM,
+               self::NSP_REFERENCE => self::NSP_REFERENCE_VALUE_NORM
        ];
 
        /**
@@ -171,6 +179,7 @@
                                self::NS_VALUE => $topUri . 'value/',
                                // predicates
                                self::NSP_DIRECT_CLAIM => $propUri . 'direct/',
+                               self::NSP_DIRECT_CLAIM_NORM => $propUri . 
'direct-normalized/',
                                self::NSP_CLAIM => $propUri,
                                self::NSP_CLAIM_STATEMENT => $propUri . 
'statement/',
                                self::NSP_CLAIM_VALUE => $propUri . 
'statement/value/',
diff --git a/repo/includes/Rdf/Values/ExternalIdentifierRdfBuilder.php 
b/repo/includes/Rdf/Values/ExternalIdentifierRdfBuilder.php
new file mode 100644
index 0000000..5d031f8
--- /dev/null
+++ b/repo/includes/Rdf/Values/ExternalIdentifierRdfBuilder.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Wikibase\Rdf\Values;
+
+use DataValues\StringValue;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\Lib\Store\PropertyInfoProvider;
+use Wikibase\Rdf\RdfVocabulary;
+use Wikibase\Rdf\ValueSnakRdfBuilder;
+use Wikimedia\Purtle\RdfWriter;
+
+/**
+ * RDF mapping for StringValues that are interpreted as external identifiers.
+ * URIs for the external identifier are generated based on a URI pattern 
associated with
+ * the respective property.
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Kinzler
+ * @author Stas Malyshev
+ */
+class ExternalIdentifierRdfBuilder implements ValueSnakRdfBuilder {
+
+       /**
+        * @var PropertyInfoProvider
+        */
+       private $uriPatternProvider;
+
+       /**
+        * @param PropertyInfoProvider $uriPatternProvider
+        */
+       public function __construct(
+               PropertyInfoProvider $uriPatternProvider
+       ) {
+               $this->uriPatternProvider = $uriPatternProvider;
+       }
+
+       /**
+        * @param RdfWriter $writer
+        * @param string $propertyValueNamespace Property value relation 
namespace
+        * @param string $propertyValueLName Property value relation name
+        * @param string $dataType Property data type
+        * @param PropertyValueSnak $snak
+        */
+       public function addValue(
+               RdfWriter $writer,
+               $propertyValueNamespace,
+               $propertyValueLName,
+               $dataType,
+               PropertyValueSnak $snak
+       ) {
+               $id = $this->getValueId( $snak->getDataValue() );
+               $uriPattern = $this->uriPatternProvider->getPropertyInfo( 
$snak->getPropertyId() );
+
+               $writer->say( $propertyValueNamespace, $propertyValueLName 
)->value( $id );
+
+               $normalizedValueNamespace = 
RdfVocabulary::$normalizedPropertyValueNamespace[$propertyValueNamespace];
+               if ( $uriPattern !== null && $normalizedValueNamespace !== null 
) {
+                       $uri = str_replace( '$1', wfUrlencode( $id ), 
$uriPattern );
+                       $writer->say( $normalizedValueNamespace, 
$propertyValueLName )->is( $uri );
+               }
+       }
+
+       /**
+        * @param StringValue $value
+        *
+        * @return string the external ID
+        */
+       private function getValueId( StringValue $value ) {
+               return trim( strval( $value->getValue() ) );
+       }
+
+}
diff --git a/repo/tests/phpunit/data/maintenance/dumpRdf-out.txt 
b/repo/tests/phpunit/data/maintenance/dumpRdf-out.txt
index ecae0d6..99f3bf1 100644
--- a/repo/tests/phpunit/data/maintenance/dumpRdf-out.txt
+++ b/repo/tests/phpunit/data/maintenance/dumpRdf-out.txt
@@ -17,6 +17,7 @@
 <fooUri/P1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://wikiba.se/ontology-beta#Property> .
 <fooUri/P1> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#String> .
 <fooUri/P1> <http://wikiba.se/ontology-beta#directClaim> 
<fooUri/prop/direct/P1> .
+<fooUri/P1> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<fooUri/prop/direct-normalized/P1> .
 <fooUri/P1> <http://wikiba.se/ontology-beta#claim> <fooUri/prop/P1> .
 <fooUri/P1> <http://wikiba.se/ontology-beta#statementProperty> 
<fooUri/prop/statement/P1> .
 <fooUri/P1> <http://wikiba.se/ontology-beta#statementValue> 
<fooUri/prop/statement/value/P1> .
@@ -35,6 +36,7 @@
 <fooUri/prop/statement/value-normalized/P1> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <fooUri/prop/qualifier/value-normalized/P1> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <fooUri/prop/reference/value-normalized/P1> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<fooUri/prop/direct-normalized/P1> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <fooUri/prop/direct/P1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <fooUri/prop/statement/P1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <fooUri/prop/qualifier/P1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -58,6 +60,7 @@
 <fooUri/P12> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://wikiba.se/ontology-beta#Property> .
 <fooUri/P12> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#String> .
 <fooUri/P12> <http://wikiba.se/ontology-beta#directClaim> 
<fooUri/prop/direct/P12> .
+<fooUri/P12> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<fooUri/prop/direct-normalized/P12> .
 <fooUri/P12> <http://wikiba.se/ontology-beta#claim> <fooUri/prop/P12> .
 <fooUri/P12> <http://wikiba.se/ontology-beta#statementProperty> 
<fooUri/prop/statement/P12> .
 <fooUri/P12> <http://wikiba.se/ontology-beta#statementValue> 
<fooUri/prop/statement/value/P12> .
@@ -76,6 +79,7 @@
 <fooUri/prop/statement/value-normalized/P12> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <fooUri/prop/qualifier/value-normalized/P12> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <fooUri/prop/reference/value-normalized/P12> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<fooUri/prop/direct-normalized/P12> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <fooUri/prop/direct/P12> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <fooUri/prop/statement/P12> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <fooUri/prop/qualifier/P12> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
diff --git a/repo/tests/phpunit/data/rdf/PropertyRdfBuilder/P2_all.nt 
b/repo/tests/phpunit/data/rdf/PropertyRdfBuilder/P2_all.nt
index 2e11201..11c9256 100644
--- a/repo/tests/phpunit/data/rdf/PropertyRdfBuilder/P2_all.nt
+++ b/repo/tests/phpunit/data/rdf/PropertyRdfBuilder/P2_all.nt
@@ -1,6 +1,7 @@
 <http://acme.test/P2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://wikiba.se/ontology-beta#Property> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P2> .
+<http://acme.test/P2> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#novalue> 
<http://acme.test/prop/novalue/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#String> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P2> .
@@ -12,19 +13,20 @@
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#statementProperty> 
<http://acme.test/prop/statement/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P2> .
 <http://acme.test/P2> 
<http://wikiba.se/ontology-beta#statementValueNormalized> 
<http://acme.test/prop/statement/value-normalized/P2> .
+<http://acme.test/prop/direct-normalized/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<http://acme.test/prop/qualifier/value-normalized/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<http://acme.test/prop/reference/value-normalized/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/novalue/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#Class> .
 <http://acme.test/prop/novalue/P2> 
<http://www.w3.org/2002/07/owl#complementOf> _:genid1 .
 <http://acme.test/prop/qualifier/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
-<http://acme.test/prop/qualifier/value-normalized/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/value/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
-<http://acme.test/prop/reference/value-normalized/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/value/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/statement/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/statement/value-normalized/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/statement/value/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 _:genid1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#Restriction> .
 _:genid1 <http://www.w3.org/2002/07/owl#onProperty> 
<http://acme.test/prop/direct/P2> .
-_:genid1 <http://www.w3.org/2002/07/owl#someValuesFrom> 
<http://www.w3.org/2002/07/owl#Thing> .
\ No newline at end of file
+_:genid1 <http://www.w3.org/2002/07/owl#someValuesFrom> 
<http://www.w3.org/2002/07/owl#Thing> .
diff --git a/repo/tests/phpunit/data/rdf/RdfBuilder/Q4_props.nt 
b/repo/tests/phpunit/data/rdf/RdfBuilder/Q4_props.nt
index 2457f09..911bf72 100644
--- a/repo/tests/phpunit/data/rdf/RdfBuilder/Q4_props.nt
+++ b/repo/tests/phpunit/data/rdf/RdfBuilder/Q4_props.nt
@@ -112,6 +112,7 @@
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#GeoShape> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P2> .
+<http://acme.test/P2> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P2> .
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P2> .
@@ -120,6 +121,7 @@
 <http://acme.test/P2> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P2> .
 <http://acme.test/P3> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P3> .
 <http://acme.test/P3> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P3> .
+<http://acme.test/P3> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P3> .
 <http://acme.test/P3> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P3> .
 <http://acme.test/P3> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P3> .
 <http://acme.test/P3> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P3> .
@@ -128,6 +130,7 @@
 <http://acme.test/P3> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P3> .
 <http://acme.test/P4> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P4> .
 <http://acme.test/P4> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P4> .
+<http://acme.test/P4> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P4> .
 <http://acme.test/P4> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P4> .
 <http://acme.test/P4> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P4> .
 <http://acme.test/P4> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P4> .
@@ -136,6 +139,7 @@
 <http://acme.test/P4> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P4> .
 <http://acme.test/P5> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P5> .
 <http://acme.test/P5> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P5> .
+<http://acme.test/P5> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P5> .
 <http://acme.test/P5> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P5> .
 <http://acme.test/P5> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P5> .
 <http://acme.test/P5> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P5> .
@@ -144,6 +148,7 @@
 <http://acme.test/P5> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P5> .
 <http://acme.test/P6> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P6> .
 <http://acme.test/P6> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P6> .
+<http://acme.test/P6> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P6> .
 <http://acme.test/P6> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P6> .
 <http://acme.test/P6> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P6> .
 <http://acme.test/P6> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P6> .
@@ -152,6 +157,7 @@
 <http://acme.test/P6> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P6> .
 <http://acme.test/P7> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P7> .
 <http://acme.test/P7> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P7> .
+<http://acme.test/P7> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P7> .
 <http://acme.test/P7> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P7> .
 <http://acme.test/P7> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P7> .
 <http://acme.test/P7> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P7> .
@@ -160,6 +166,7 @@
 <http://acme.test/P7> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P7> .
 <http://acme.test/P8> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P8> .
 <http://acme.test/P8> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P8> .
+<http://acme.test/P8> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P8> .
 <http://acme.test/P8> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P8> .
 <http://acme.test/P8> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P8> .
 <http://acme.test/P8> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P8> .
@@ -168,6 +175,7 @@
 <http://acme.test/P8> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P8> .
 <http://acme.test/P9> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P9> .
 <http://acme.test/P9> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P9> .
+<http://acme.test/P9> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P9> .
 <http://acme.test/P9> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P9> .
 <http://acme.test/P9> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P9> .
 <http://acme.test/P9> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P9> .
@@ -176,6 +184,7 @@
 <http://acme.test/P9> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P9> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P10> .
+<http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P10> .
@@ -238,6 +247,7 @@
 _:genid10 <http://www.w3.org/2002/07/owl#someValuesFrom> 
<http://www.w3.org/2002/07/owl#Thing> .
 <http://acme.test/prop/P2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<http://acme.test/prop/direct-normalized/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/value/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
@@ -246,6 +256,7 @@
 <http://acme.test/prop/statement/value/P2> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P3> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<http://acme.test/prop/direct-normalized/P3> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P3> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/value/P3> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P3> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
@@ -254,6 +265,7 @@
 <http://acme.test/prop/statement/value/P3> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P4> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P4> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P4> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P4> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/value/P4> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P4> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -262,6 +274,7 @@
 <http://acme.test/prop/statement/value/P4> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P5> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P5> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P5> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P5> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/value/P5> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P5> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -270,6 +283,7 @@
 <http://acme.test/prop/statement/value/P5> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P6> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P6> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P6> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P6> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/value/P6> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P6> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -278,6 +292,7 @@
 <http://acme.test/prop/statement/value/P6> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P7> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P7> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P7> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P7> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/value/P7> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P7> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -286,6 +301,7 @@
 <http://acme.test/prop/statement/value/P7> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P8> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P8> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P8> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P8> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/value/P8> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P8> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -294,6 +310,7 @@
 <http://acme.test/prop/statement/value/P8> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P9> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P9> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<http://acme.test/prop/direct-normalized/P9> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P9> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/value/P9> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P9> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
@@ -302,6 +319,7 @@
 <http://acme.test/prop/statement/value/P9> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/P10> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
+<http://acme.test/prop/direct-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/value/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
diff --git a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-entities.nt 
b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-entities.nt
index 5e6b175..e6b72e6 100644
--- a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-entities.nt
+++ b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-entities.nt
@@ -38,6 +38,7 @@
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#Wibblywobbly> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P10> .
+<http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P10> .
@@ -52,6 +53,7 @@
 _:genid1 <http://www.w3.org/2002/07/owl#someValuesFrom> 
<http://www.w3.org/2002/07/owl#Thing> .
 <http://acme.test/prop/P10> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/value/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
diff --git a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-redirect.nt 
b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-redirect.nt
index 903f803..1b883fe 100644
--- a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-redirect.nt
+++ b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/full-dump-redirect.nt
@@ -20,6 +20,7 @@
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#Wibblywobbly> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P10> .
+<http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#qualifier> 
<http://acme.test/prop/qualifier/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#qualifierValue> 
<http://acme.test/prop/qualifier/value/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#reference> 
<http://acme.test/prop/reference/P10> .
@@ -28,6 +29,7 @@
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P10> .
 <http://acme.test/prop/P10> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/qualifier/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/value/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
diff --git 
a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-entities.nt 
b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-entities.nt
index 690597a..e1dce28 100644
--- a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-entities.nt
+++ b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-entities.nt
@@ -15,6 +15,7 @@
 <http://acme.test/P10> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://wikiba.se/ontology-beta#Property> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#Wibblywobbly> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P10> .
+<http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#statementProperty> 
<http://acme.test/prop/statement/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P10> .
@@ -34,6 +35,7 @@
 <http://acme.test/prop/qualifier/value-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/value-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/statement/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/reference/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -57,4 +59,4 @@
 <http://acme.test/Q40> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://wikiba.se/ontology-beta#Item> .
 <http://acme.test/Q40> <http://www.w3.org/2000/01/rdf-schema#label> 
"label:Q40"@en .
 <http://acme.test/Q40> <http://www.w3.org/2004/02/skos/core#prefLabel> 
"label:Q40"@en .
-<http://acme.test/Q40> <http://schema.org/name> "label:Q40"@en .
\ No newline at end of file
+<http://acme.test/Q40> <http://schema.org/name> "label:Q40"@en .
diff --git 
a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-redirect.nt 
b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-redirect.nt
index 87ee31a..6087b8c 100644
--- a/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-redirect.nt
+++ b/repo/tests/phpunit/data/rdf/RdfDumpGenerator/truthy-dump-redirect.nt
@@ -15,6 +15,7 @@
 <http://acme.test/P10> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://wikiba.se/ontology-beta#Property> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#propertyType> 
<http://wikiba.se/ontology-beta#Wibblywobbly> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaim> 
<http://acme.test/prop/direct/P10> .
+<http://acme.test/P10> <http://wikiba.se/ontology-beta#directClaimNormalized> 
<http://acme.test/prop/direct-normalized/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#claim> 
<http://acme.test/prop/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#statementProperty> 
<http://acme.test/prop/statement/P10> .
 <http://acme.test/P10> <http://wikiba.se/ontology-beta#statementValue> 
<http://acme.test/prop/statement/value/P10> .
@@ -34,6 +35,7 @@
 <http://acme.test/prop/qualifier/value-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/reference/value-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/direct/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
+<http://acme.test/prop/direct-normalized/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#ObjectProperty> .
 <http://acme.test/prop/statement/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/qualifier/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
 <http://acme.test/prop/reference/P10> 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#DatatypeProperty> .
@@ -42,4 +44,4 @@
 _:genid1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/07/owl#Restriction> .
 _:genid1 <http://www.w3.org/2002/07/owl#onProperty> 
<http://acme.test/prop/direct/P10> .
 _:genid1 <http://www.w3.org/2002/07/owl#someValuesFrom> 
<http://www.w3.org/2002/07/owl#Thing> .
-<http://acme.test/Q4242> <http://www.w3.org/2002/07/owl#sameAs> 
<http://acme.test/Q42> .
\ No newline at end of file
+<http://acme.test/Q4242> <http://www.w3.org/2002/07/owl#sameAs> 
<http://acme.test/Q42> .
diff --git a/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php 
b/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php
index c66a4a6..432ddba 100644
--- a/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php
+++ b/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php
@@ -136,6 +136,7 @@
                $siteLookup = $this->getTestData()->getSiteLookup();
 
                // Note: using the actual factory here makes this an 
integration test!
+               // FIXME: we want to inject an ExternalIdentifierRdfBuilder 
here somehow!
                $valueBuilderFactory = 
WikibaseRepo::getDefaultInstance()->getValueSnakRdfBuilderFactory();
                $entityRdfBuilderFactory = new EntityRdfBuilderFactory( 
$this->getRdfBuilderFactoryCallbacks( $siteLookup ) );
                $emitter = new NTriplesRdfWriter();
diff --git 
a/repo/tests/phpunit/includes/Rdf/Values/ExternalIdentifierRdfBuilderTest.php 
b/repo/tests/phpunit/includes/Rdf/Values/ExternalIdentifierRdfBuilderTest.php
new file mode 100644
index 0000000..eda3e4f
--- /dev/null
+++ 
b/repo/tests/phpunit/includes/Rdf/Values/ExternalIdentifierRdfBuilderTest.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Wikibase\Test\Rdf;
+
+use DataValues\StringValue;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\Lib\Store\PropertyInfoProvider;
+use Wikibase\Rdf\Values\ExternalIdentifierRdfBuilder;
+use Wikibase\Repo\Tests\Rdf\NTriplesRdfTestHelper;
+use Wikibase\Repo\WikibaseRepo;
+use Wikimedia\Purtle\NTriplesRdfWriter;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+
+/**
+ * @covers Wikibase\Rdf\Values\ExternalIdentifierRdfBuilder
+ *
+ * @group Wikibase
+ * @group WikibaseRepo
+ * @group WikibaseRdf
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Kinzler
+ */
+class ExternalIdentifierRdfBuilderTest extends \PHPUnit_Framework_TestCase {
+
+       /**
+        * @var NTriplesRdfTestHelper
+        */
+       private $helper;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->helper = new NTriplesRdfTestHelper();
+       }
+
+       public function testAddValue() {
+               $uriPatternProvider = $this->getMock( 
PropertyInfoProvider::class );
+               $uriPatternProvider->expects( $this->any() )
+                       ->method( 'getPropertyInfo' )
+                       ->will( $this->returnCallback( function( PropertyId $id 
) {
+                               return $id->getSerialization() === 'P1' ? 
'http://xyzzy.test/vocab/$1' : null;
+                       } ) );
+
+               $builder = new ExternalIdentifierRdfBuilder( 
$uriPatternProvider );
+
+               $writer = new NTriplesRdfWriter();
+               $writer->prefix( 'www', "http://www.test/"; );
+               $writer->prefix( 'wdt', "http://acme.test/prop/"; );
+               $writer->prefix( 'wdtn', "http://acme.test/prop-normalized/"; );
+
+               $writer->start();
+               $writer->about( 'www', 'Q1' );
+
+               $snakP1 = new PropertyValueSnak(
+                       new PropertyId( 'P1' ),
+                       new StringValue( 'AB&123' )
+               );
+
+               $snakP345 = new PropertyValueSnak(
+                       new PropertyId( 'P345' ),
+                       new StringValue( 'XY-23' )
+               );
+
+               $builder->addValue( $writer, 'wdt', 'P1', 'DUMMY', $snakP1 );
+               $builder->addValue( $writer, 'wdt', 'P345', 'DUMMY', $snakP345 
);
+
+               $expected = [
+                       '<http://www.test/Q1> 
<http://acme.test/prop-normalized/P1> <http://xyzzy.test/vocab/AB%26123> .',
+                       '<http://www.test/Q1> <http://acme.test/prop/P1> 
"AB&123" .',
+                       '<http://www.test/Q1> <http://acme.test/prop/P345> 
"XY-23" .',
+               ];
+               $this->helper->assertNTriplesEquals( $expected, 
$writer->drain() );
+       }
+
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/258519
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I44a203bddfece0d275c31d089a1172ab71891dae
Gerrit-PatchSet: 25
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Daniel Kinzler <daniel.kinz...@wikimedia.de>
Gerrit-Reviewer: Addshore <addshorew...@gmail.com>
Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de>
Gerrit-Reviewer: Ladsgroup <ladsgr...@gmail.com>
Gerrit-Reviewer: Lucas Werkmeister (WMDE) <lucas.werkmeis...@wikimedia.de>
Gerrit-Reviewer: Smalyshev <smalys...@wikimedia.org>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to