Tobias Gritschacher has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/63433


Change subject: (bug 44578) improved RDF mapping using schema.org
......................................................................

(bug 44578) improved RDF mapping using schema.org

Change-Id: Ie05a67c810755cd19bb59ae133efcc0e76b717ef
---
M repo/includes/rdf/RdfBuilder.php
M repo/tests/phpunit/includes/rdf/RdfBuilderTest.php
M repo/tests/phpunit/includes/rdf/RdfSerializerTest.php
3 files changed, 76 insertions(+), 20 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/33/63433/1

diff --git a/repo/includes/rdf/RdfBuilder.php b/repo/includes/rdf/RdfBuilder.php
index 3557875..2267357 100755
--- a/repo/includes/rdf/RdfBuilder.php
+++ b/repo/includes/rdf/RdfBuilder.php
@@ -55,10 +55,10 @@
        const NS_STATEMENT = 's'; // entity -> statement
 
        const NS_SKOS = 'skos'; // SKOS vocabulary
-       const NS_FOAF = 'foaf'; // FOAF vocabulary
+       const NS_SCHEMA_ORG = 'schema'; // schema.org vocabulary
 
        const SKOS_URI = 'http://www.w3.org/2004/02/skos/core#';
-       const FOAF_URI = 'http://xmlns.com/foaf/0.1/';
+       const SCHEMA_ORG_URI = 'http://schema.org/';
 
        const WIKIBASE_STATEMENT_QNAME = 'wikibase:Statement';
 
@@ -106,7 +106,7 @@
                        self::NS_QUALIFIER => $this->baseUri . '/qualifier/',
                        self::NS_STATEMENT => $this->baseUri . '/statement/',
                        self::NS_SKOS => self::SKOS_URI,
-                       self::NS_FOAF => self::FOAF_URI,
+                       self::NS_SCHEMA_ORG => self::SCHEMA_ORG_URI,
                );
 
                //XXX: Ugh, static. Should go into $this->graph.
@@ -197,6 +197,19 @@
        }
 
        /**
+        * Gets a URL of the rdf description of the given entity
+        *
+        * @param EntityId $id
+        *
+        * @return string
+        */
+       public function getDataURL( EntityId $id ) {
+               $base = $this->namespaces[ self::NS_DATA ];
+               $url = $base . $this->idFormatter->format( $id );
+               return $url;
+       }
+
+       /**
         * Language filter
         *
         * @param $lang
@@ -240,9 +253,20 @@
        public function addEntityMetaData( Entity $entity, Revision $rev = null 
) {
                $entityResource = $this->getEntityResource( $entity->getId() );
                $entityResource->addResource( 'rdf:type', 
$this->getEntityTypeQName( $entity->getType() ) );
-               $entityResource->addResource( 'foaf:primaryTopicOf', 
$this->getEntityQName( self::NS_DATA, $entity->getId() ) );
 
-               //TODO: revision timestamp, revision id, versioned data URI
+               $dataResource = $this->graph->resource( '#' ); // "this 
document"
+               $dataURL = $this->getDataURL( $entity->getId() );
+               $dataResource->addResource( self::NS_SCHEMA_ORG . ':about', 
$entityResource );
+               $dataResource->addResource( self::NS_SCHEMA_ORG . ':url', 
$dataURL );
+               $dataResource->addResource( 'rdf:type', self::NS_SCHEMA_ORG . 
":Dataset" );
+
+               if ( $rev ) {
+                       $dataResource->addLiteral( self::NS_SCHEMA_ORG . 
':version', $rev->getId() );
+                       $dataResource->addLiteral( self::NS_SCHEMA_ORG . 
':dateModified', wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ) );
+                       //TODO: add support for date types to EasyRDF
+               }
+
+               //TODO: revision timestamp, revision id, versioned data URI, 
current-version-of
 
                $this->entityResolved( $entity->getId() );
        }
@@ -261,7 +285,8 @@
                        }
 
                        $entityResource->addLiteral( 'rdfs:label', $labelText, 
$languageCode );
-                       $entityResource->addLiteral( 'skos:prefLabel', 
$labelText, $languageCode );
+                       $entityResource->addLiteral( self::NS_SKOS . 
':prefLabel', $labelText, $languageCode );
+                       $entityResource->addLiteral( self::NS_SCHEMA_ORG . 
':name', $labelText, $languageCode );
                }
        }
 
@@ -278,7 +303,7 @@
                                continue;
                        }
 
-                       $entityResource->addLiteral( 'skos:note', $description, 
$languageCode );
+                       $entityResource->addLiteral( self::NS_SCHEMA_ORG . 
':description', $description, $languageCode );
                }
        }
 
@@ -296,7 +321,7 @@
                        }
 
                        foreach ( $aliases as $alias ) {
-                               $entityResource->addLiteral( 'skos:altLabel', 
$alias, $languageCode );
+                               $entityResource->addLiteral( self::NS_SKOS . 
':altLabel', $alias, $languageCode );
                        }
                }
        }
@@ -320,7 +345,10 @@
                        //XXX: ideally, we'd use https if the target site 
supports it.
                        $url = wfExpandUrl( $link->getUrl(), PROTO_HTTP );
                        $pageRecourse = $this->graph->resource( $url );
-                       $entityResource->addResource( 'foaf:primaryTopicOf', 
$pageRecourse, $languageCode );
+
+                       $pageRecourse->addResource( self::NS_SCHEMA_ORG . 
':about', $entityResource );
+                       $pageRecourse->addResource( self::NS_SCHEMA_ORG . 
':inLanguage', $languageCode );
+                       $pageRecourse->addResource( 'rdf:type', 
self::NS_SCHEMA_ORG . ':Article' );
                }
        }
 
diff --git a/repo/tests/phpunit/includes/rdf/RdfBuilderTest.php 
b/repo/tests/phpunit/includes/rdf/RdfBuilderTest.php
index f786b1e..dd48eea 100644
--- a/repo/tests/phpunit/includes/rdf/RdfBuilderTest.php
+++ b/repo/tests/phpunit/includes/rdf/RdfBuilderTest.php
@@ -95,19 +95,32 @@
 
        /**
         * @param \Wikibase\EntityId $entityId
-        * @param array $properties
+        * @param array $entityProps
+        * @param array $dataProps
         *
         * @return \EasyRdf_Graph
         */
-       protected static function makeEntityGraph( EntityId $entityId, 
$properties ) {
+       protected static function makeEntityGraph( EntityId $entityId, 
$entityProps, $dataProps ) {
                $graph = new \EasyRdf_Graph();
 
                $builder = self::newRdfBuilder( 'rdf' ); //XXX: ugh, dummy 
object
 
                $entityUri = $builder->getEntityQName( RdfBuilder::NS_ENTITY, 
$entityId );
                $entityResource = $graph->resource( $entityUri );
+               $dataResource = $graph->resource( '#' );
 
-               /* @var \EasyRdf_Resource $entityResource */
+               self::addProperties( $graph, $entityResource, $entityProps );
+               self::addProperties( $graph, $dataResource, $dataProps );
+
+               return $graph;
+       }
+
+       /**
+        * @param \EasyRdf_Graph    $graph
+        * @param \EasyRdf_Resource $resources
+        * @param array  $properties
+        */
+       protected static function addProperties( \EasyRdf_Graph $graph, 
\EasyRdf_Resource $resource, $properties ) {
                foreach ( $properties as $prop => $values ) {
                        if ( is_scalar( $values ) ) {
                                $values = array( $values );
@@ -118,11 +131,9 @@
                                        $val = $graph->resource( $val );
                                }
 
-                               $entityResource->add( $prop, $val );
+                               $resource->add( $prop, $val );
                        }
                }
-
-               return $graph;
        }
 
        /**
@@ -152,6 +163,9 @@
                        $entities['empty']->getId(),
                        array(
                                'rdf:type' => $builder->getEntityTypeQName( 
Item::ENTITY_TYPE ),
+                       ),
+                       array(
+                               'rdf:type' => RdfBuilder::NS_SCHEMA_ORG . 
':Dataset',
                        )
                );
 
@@ -159,7 +173,6 @@
                        $entities['terms']->getId(),
                        array(
                                'rdf:type' => $builder->getEntityTypeQName( 
Item::ENTITY_TYPE ),
-                               'foaf:primaryTopicOf' => 
$builder->getEntityQName( RdfBuilder::NS_DATA, $entities['terms']->getId() ),
                                'rdfs:label' => array(
                                        new \EasyRdf_Literal( 'Berlin', 'en' ),
                                        new \EasyRdf_Literal( 'Берлин', 'ru' )
@@ -168,7 +181,11 @@
                                        new \EasyRdf_Literal( 'Berlin', 'en' ),
                                        new \EasyRdf_Literal( 'Берлин', 'ru' )
                                ),
-                               'skos:note' => array(
+                               'schema:name' => array(
+                                       new \EasyRdf_Literal( 'Berlin', 'en' ),
+                                       new \EasyRdf_Literal( 'Берлин', 'ru' )
+                               ),
+                               'schema:description' => array(
                                        new \EasyRdf_Literal( 'German city', 
'en' ),
                                        new \EasyRdf_Literal( 'столица и 
одновременно земля Германии', 'ru' )
                                ),
@@ -177,6 +194,11 @@
                                        new \EasyRdf_Literal( 'Land Berlin', 
'en' ),
                                        new \EasyRdf_Literal( 'Berlin', 'ru' )
                                ),
+                       ),
+                       array(
+                               'rdf:type' => RdfBuilder::NS_SCHEMA_ORG . 
':Dataset',
+                               'schema:about' => $builder->getEntityQName( 
RdfBuilder::NS_ENTITY, $entities['terms']->getId() ),
+                               'schema:url' => $builder->getDataURL( 
$entities['terms']->getId() ),
                        )
                );
 
@@ -230,7 +252,9 @@
                $graph = $builder->getGraph();
 
                foreach ( $expectedGraph->resources() as $rc ) {
-                       foreach ( $expectedGraph->properties( $rc ) as $prop ) {
+                       $props = $expectedGraph->properties( $rc );
+
+                       foreach ( $props as $prop ) {
                                $expectedValues = $expectedGraph->all( $rc, 
$prop );
                                $actualValues = $graph->all( $rc, $prop );
 
@@ -272,5 +296,6 @@
 
        //TODO: test resolveMentionedEntities
        //TODO: test all the addXXX methods
+       //TODO: test all the getXXX methods
 
 }
diff --git a/repo/tests/phpunit/includes/rdf/RdfSerializerTest.php 
b/repo/tests/phpunit/includes/rdf/RdfSerializerTest.php
index 9136029..c27d708 100644
--- a/repo/tests/phpunit/includes/rdf/RdfSerializerTest.php
+++ b/repo/tests/phpunit/includes/rdf/RdfSerializerTest.php
@@ -118,7 +118,8 @@
                        '!<wikibase:Item.*rdf:about=".*?entity/q2"!s',
                        '!<rdfs:label xml:lang="en">Berlin</rdfs:label>!s',
                        '!<skos:prefLabel 
xml:lang="en">Berlin</skos:prefLabel>!s',
-                       '!<skos:note xml:lang="en">German city</skos:note>!s',
+                       '!<schema:name xml:lang="en">Berlin</schema:name>!s',
+                       '!<schema:description xml:lang="en">German 
city</schema:description>!s',
                        '!<skos:altLabel xml:lang="en">Berlin, 
Germany</skos:altLabel>!s',
                );
 
@@ -126,10 +127,12 @@
                        '!entity:q2!s',
                        '!rdfs:label +"Berlin"@en,!s',
                        '!skos:prefLabel +"Berlin"@en,!s',
-                       '!skos:note +"German city"@en,!s',
+                       '!schema:name +"Berlin"@en,!s',
+                       '!schema:description +"German city"@en,!s',
                        '!skos:altLabel +"Berlin, Germany"@en,!s',
                );
 
+               // TODO: check meta
                // TODO: test links
                // TODO: test data values
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie05a67c810755cd19bb59ae133efcc0e76b717ef
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: mw1.22-wmf4
Gerrit-Owner: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to