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