ghillairet / emftriple Goto Github PK
View Code? Open in Web Editor NEWEMF Binding for RDF
EMF Binding for RDF
The save method on ETripleResource translates its contents onto triples and send those to the RDF store.
Currently, when the save method is called, there is no mechanism that look at already saved objects, thus it always translate and save the all object graph.
Solutions:
Hello,
when trying to save the resource I encounter following exception:
Exception in thread "main" java.lang.IllegalArgumentException: Not a valid (absolute) URI: my.rdf#1
at org.openrdf.model.impl.URIImpl.setURIString(URIImpl.java:79)
at org.openrdf.model.impl.URIImpl.<init>(URIImpl.java:68)
at org.eclipselabs.emftriple.sesame.map.Extensions.toURI(Extensions.java:40)
at org.eclipselabs.emftriple.sesame.map.Extensions.toURI(Extensions.java:34)
at org.eclipselabs.emftriple.sesame.map.Serializer.createTypeStatement(Serializer.java:76)
at org.eclipselabs.emftriple.sesame.map.Serializer.to(Serializer.java:51)
at org.eclipselabs.emftriple.sesame.map.Serializer$2.apply(Serializer.java:39)
at org.eclipselabs.emftriple.sesame.map.Serializer$2.apply(Serializer.java:1)
at org.eclipse.xtext.xbase.lib.IteratorExtensions.forEach(IteratorExtensions.java:362)
at org.eclipse.xtext.xbase.lib.IterableExtensions.forEach(IterableExtensions.java:331)
at org.eclipselabs.emftriple.sesame.map.Serializer.to(Serializer.java:42)
at org.eclipselabs.emftriple.sesame.map.EObjectMapper.to(EObjectMapper.java:37)
at org.eclipselabs.emftriple.sesame.map.EObjectMapper.to(EObjectMapper.java:19)
at org.eclipselabs.emftriple.sesame.resource.RDFResource.doSave(RDFResource.java:60)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:999)
at org.eclipselabs.emftriple.example.Main.test(Main.java:97)
The model is the one from:
emftriple/examples/org.eclipselabs.emftriple.examples.basic/model/model.ecore
This is my code (copied from the git README):
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new RDFResourceFactory());
ResourceSet resourceSet = new ResourceSetImpl();
Resource r = resourceSet.createResource(URI.createURI("my.rdf"));
Parent b = ModelFactory.eINSTANCE.createParent();
b.setId("1");
b.setName("Parent1");
r.getContents().add(b);
r.save(null);
The import statements are:
package org.eclipselabs.emftriple.example;
import java.io.IOException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipselabs.emftriple.example.model.Child;
import org.eclipselabs.emftriple.example.model.ModelFactory;
import org.eclipselabs.emftriple.example.model.ModelPackage;
import org.eclipselabs.emftriple.example.model.Parent;
import org.eclipselabs.emftriple.sesame.handlers.RepositoryHandler;
import org.eclipselabs.emftriple.sesame.resource.RDFResourceFactory;
import org.eclipselabs.emftriple.sesame.resource.TTLResource;
import org.eclipselabs.emftriple.sesame.resource.TTLResourceFactory;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.sail.memory.MemoryStore;
I tried with different URI formats and absolute paths, but I seem to have a problem when saving to a file.
Update wiki pages on the eclipselabs site:
The example in the README (Sesame, Jena) throws an exception for both implementation:
Sesame:
Exception in thread "main" java.lang.IllegalArgumentException: Not a valid (absolute) URI: my.rdf#/
at org.openrdf.model.impl.URIImpl.setURIString(URIImpl.java:79)
at org.openrdf.model.impl.URIImpl.<init>(URIImpl.java:68)
at org.eclipselabs.emftriple.sesame.map.Extensions.toURI(Extensions.java:37)
at org.eclipselabs.emftriple.sesame.map.Extensions.toURI(Extensions.java:32)
at org.eclipselabs.emftriple.sesame.map.Serializer.createTypeStatement(Serializer.java:72)
at org.eclipselabs.emftriple.sesame.map.Serializer.to(Serializer.java:45)
at org.eclipselabs.emftriple.sesame.map.Serializer$1.accept(Serializer.java:33)
at org.eclipselabs.emftriple.sesame.map.Serializer$1.accept(Serializer.java:1)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.eclipselabs.emftriple.sesame.map.Serializer.to(Serializer.java:36)
at org.eclipselabs.emftriple.sesame.map.EObjectMapper.to(EObjectMapper.java:34)
at org.eclipselabs.emftriple.sesame.map.EObjectMapper.to(EObjectMapper.java:19)
at org.eclipselabs.emftriple.sesame.resource.RDFResource.doSave(RDFResource.java:58)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:999)
at org.eclipselabs.emftriples.examples.maven.EMFTripleExample.main(EMFTripleExample.java:27)
Jena:
Exception in thread "main" com.hp.hpl.jena.shared.BadURIException: Only well-formed absolute URIrefs can be included in RDF/XML output: <my.rdf#/> Code: 57/REQUIRED_COMPONENT_MISSING in SCHEME: A component that is required by the scheme is missing.
at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.checkURI(BaseXMLWriter.java:820)
at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.relativize(BaseXMLWriter.java:797)
at com.hp.hpl.jena.xmloutput.impl.Basic.writeResourceId(Basic.java:144)
at com.hp.hpl.jena.xmloutput.impl.Basic.writeDescriptionHeader(Basic.java:92)
at com.hp.hpl.jena.xmloutput.impl.Basic.writeRDFStatements(Basic.java:84)
at com.hp.hpl.jena.xmloutput.impl.Basic.writeRDFStatements(Basic.java:74)
at com.hp.hpl.jena.xmloutput.impl.Basic.writeBody(Basic.java:48)
at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.writeXMLBody(BaseXMLWriter.java:492)
at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.write(BaseXMLWriter.java:464)
at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.write(BaseXMLWriter.java:450)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.write(ModelCom.java:347)
at org.eclipselabs.emftriple.jena.io.RDFWriter.writeXML(RDFWriter.java:47)
at org.eclipselabs.emftriple.jena.io.RDFWriter.write(RDFWriter.java:28)
at org.eclipselabs.emftriple.jena.resource.RDFResource.write(RDFResource.java:67)
at org.eclipselabs.emftriple.jena.resource.RDFResource.doSave(RDFResource.java:58)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:999)
at org.eclipselabs.emftriples.examples.maven.sesame.EMFTripleExample.main(EMFTripleExample.java:26)
To fix this, I changed the my.rdf
URI to a file URI file:///tmp/my.rdf
:
final Resource r = resourceSet.createResource(URI.createURI("file:///tmp/my.rdf"));
This runs fine for both.
Sesame:
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="file:///tmp/my.rdf#/">
<rdf:type rdf:resource="http://www.eclipselabs.org/emf/junit#//Book"/>
<title xmlns="http://www.eclipselabs.org/emf/junit#//Book/" rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The Book</title>
<tags xmlns="http://www.eclipselabs.org/emf/junit#//Book/" rdf:datatype="http://www.w3.org/2001/XMLSchema#string">SciFI</tags>
<tags xmlns="http://www.eclipselabs.org/emf/junit#//Book/" rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Fantasy</tags>
</rdf:Description>
</rdf:RDF>
Jena:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:j.0="http://www.eclipselabs.org/emf/junit#//Book/"
xmlns:j.1="http://www.eclipselabs.org/emf/junit#//" >
<rdf:Description rdf:about="file:///tmp/my.rdf#/">
<j.0:tags>Fantasy</j.0:tags>
<j.0:tags>SciFI</j.0:tags>
<j.0:title>The Book</j.0:title>
<rdf:type rdf:resource="http://www.eclipselabs.org/emf/junit#//Book"/>
</rdf:Description>
</rdf:RDF>
The latter is very similar to the output suggested in the README, the main difference is (of course) the URI in the rdf:about
attribute.
Should this be fixed in the README or the implementation?
I'm getting the following error message, caused by adding EMFTriple to my project:
Bundle was not resolved because of a uses contraint violation.
org.osgi.service.resolver.ResolutionException: Uses constraint violation. Unable to resolve resource com.intel.sam [osgi.identity; osgi.identity="com.intel.sam"; type="osgi.bundle"; version:Version="1.8.0.qualifier"; singleton:="true"] because it is exposed to package 'javax.annotation' from resources javax.annotation [osgi.identity; osgi.identity="javax.annotation"; type="osgi.bundle"; version:Version="1.2.0.v201401042248"] and org.eclipse.osgi [osgi.identity; osgi.identity="org.eclipse.osgi"; type="osgi.bundle"; version:Version="3.10.102.v20160118-1700"; singleton:="true"] via two dependency chains.
Chain 1:
com.intel.sam [osgi.identity; osgi.identity="com.intel.sam"; type="osgi.bundle"; version:Version="1.8.0.qualifier"; singleton:="true"]
import: (&(osgi.wiring.package=javax.annotation)(version>=1.0.0))
|
export: osgi.wiring.package: javax.annotation
javax.annotation [osgi.identity; osgi.identity="javax.annotation"; type="osgi.bundle"; version:Version="1.2.0.v201401042248"]
Chain 2:
com.intel.sam [osgi.identity; osgi.identity="com.intel.sam"; type="osgi.bundle"; version:Version="1.8.0.qualifier"; singleton:="true"]
require: (&(osgi.wiring.bundle=org.eclipselabs.emftriple)(bundle-version>=1.1.0))
|
provide: osgi.wiring.bundle; bundle-version:Version="1.1.0.201601171849"; osgi.wiring.bundle="org.eclipselabs.emftriple"
com.google.guava [osgi.identity; osgi.identity="com.google.guava"; type="osgi.bundle"; version:Version="15.0.0.v201403281430"]
import: (osgi.wiring.package=javax.annotation)
|
export: osgi.wiring.package: javax.annotation
org.eclipse.osgi [osgi.identity; osgi.identity="org.eclipse.osgi"; type="osgi.bundle"; version:Version="3.10.102.v20160118-1700"; singleton:="true"]
I'm kind of puzzled, and not even sure how I have to parse this error. Somehow it seems to be related to java.annotation versions or com.google.guava
Any help is highly appreciated.
Cheers,
Rudi
I have a rather complex Ecore model which I'm trying to serialize to RDF with emftriple.
The storage method is according to the one found in the the README.
Upon calling resource.getContents().add(model);
I get the following exception:
Exception in thread "main" java.lang.IllegalArgumentException: The datatype 'EFeatureMapEntry' is not a valid classifier
at org.eclipse.emf.ecore.impl.EcoreFactoryImpl.convertToString(EcoreFactoryImpl.java:221)
at org.eclipse.emf.ecore.util.EcoreUtil.convertToString(EcoreUtil.java:3495)
at org.eclipselabs.emftriple.sesame.map.Extensions.toLiteral(Extensions.java:48)
at org.eclipselabs.emftriple.sesame.map.Extensions.add(Extensions.java:58)
at org.eclipselabs.emftriple.sesame.map.Serializer$5.apply(Serializer.java:114)
at org.eclipse.xtext.xbase.lib.IteratorExtensions.forEach(IteratorExtensions.java:362)
at org.eclipse.xtext.xbase.lib.IterableExtensions.forEach(IterableExtensions.java:331)
at org.eclipselabs.emftriple.sesame.map.Serializer.serialize(Serializer.java:117)
at org.eclipselabs.emftriple.sesame.map.Serializer.access$0(Serializer.java:86)
at org.eclipselabs.emftriple.sesame.map.Serializer$3.apply(Serializer.java:56)
at org.eclipselabs.emftriple.sesame.map.Serializer$3.apply(Serializer.java:1)
at org.eclipse.xtext.xbase.lib.IteratorExtensions.forEach(IteratorExtensions.java:362)
at org.eclipse.xtext.xbase.lib.IterableExtensions.forEach(IterableExtensions.java:331)
at org.eclipselabs.emftriple.sesame.map.Serializer.to(Serializer.java:59)
at org.eclipselabs.emftriple.sesame.map.Serializer.serializeOne(Serializer.java:173)
at org.eclipselabs.emftriple.sesame.map.Serializer.serialize(Serializer.java:160)
at org.eclipselabs.emftriple.sesame.map.Serializer.access$1(Serializer.java:127)
at org.eclipselabs.emftriple.sesame.map.Serializer$4.apply(Serializer.java:64)
at org.eclipselabs.emftriple.sesame.map.Serializer$4.apply(Serializer.java:1)
at org.eclipse.xtext.xbase.lib.IteratorExtensions.forEach(IteratorExtensions.java:362)
at org.eclipse.xtext.xbase.lib.IterableExtensions.forEach(IterableExtensions.java:331)
at org.eclipselabs.emftriple.sesame.map.Serializer.to(Serializer.java:67)
at org.eclipselabs.emftriple.sesame.map.Serializer$2.apply(Serializer.java:39)
at org.eclipselabs.emftriple.sesame.map.Serializer$2.apply(Serializer.java:1)
at org.eclipse.xtext.xbase.lib.IteratorExtensions.forEach(IteratorExtensions.java:362)
at org.eclipse.xtext.xbase.lib.IterableExtensions.forEach(IterableExtensions.java:331)
at org.eclipselabs.emftriple.sesame.map.Serializer.to(Serializer.java:42)
at org.eclipselabs.emftriple.sesame.map.EObjectMapper.to(EObjectMapper.java:37)
at org.eclipselabs.emftriple.sesame.map.EObjectMapper.to(EObjectMapper.java:19)
at org.eclipselabs.emftriple.sesame.resource.RDFResource.doSave(RDFResource.java:60)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:999)
at Model2RDF.saveModel(Model2RDF.java:76)
at Model2RDF.main(Model2RDF.java:39)
For some strange reason, the p2 repository does not work from Maven. I noticed that you published a new version of EMFJson (ghillairet/p2@7d5c122), and this replaced the (compositeContent|compositeArtifacts).xml
files with (compositeContent|compositeArtifacts).jar
files (which contain the respective XML files). The JAR files seem fine and the repository contains dependencies required for building EMFTriple. However, Maven throws the following exception while building EMFTriple:
Unable to read repository at http://ghillairet.github.com/p2. No repository found at http://ghillairet.github.com/p2/releases/emfjson/0.14.0. -> [Help 1]
org.apache.maven.InternalErrorException: Internal error: java.lang.RuntimeException: Failed to load p2 repository with ID 'dependencies' from location http://ghillairet.github.com/p2
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:168)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: java.lang.RuntimeException: Failed to load p2 repository with ID 'dependencies' from location http://ghillairet.github.com/p2
at org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl.loadMetadataRepository(TargetPlatformFactoryImpl.java:302)
at org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl.gatherExternalInstallableUnits(TargetPlatformFactoryImpl.java:270)
at org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl.createTargetPlatform(TargetPlatformFactoryImpl.java:176)
at org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl.createTargetPlatform(TargetPlatformFactoryImpl.java:128)
at org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl.createTargetPlatform(TargetPlatformFactoryImpl.java:1)
at org.eclipse.tycho.p2.manager.ReactorRepositoryManagerImpl.computePreliminaryTargetPlatform(ReactorRepositoryManagerImpl.java:84)
at org.eclipse.tycho.p2.resolver.P2DependencyResolver.computePreliminaryTargetPlatform(P2DependencyResolver.java:223)
at org.eclipse.tycho.core.resolver.DefaultTychoResolver.resolveProject(DefaultTychoResolver.java:109)
at org.eclipse.tycho.core.maven.TychoMavenLifecycleParticipant.afterProjectsRead(TychoMavenLifecycleParticipant.java:95)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:274)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
... 11 more
Caused by: org.eclipse.equinox.p2.core.ProvisionException: Unable to read repository at http://ghillairet.github.com/p2.
at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.addChild(CompositeMetadataRepository.java:185)
at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.<init>(CompositeMetadataRepository.java:106)
at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepositoryFactory.load(CompositeMetadataRepositoryFactory.java:122)
at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.factoryLoad(MetadataRepositoryManager.java:57)
at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:768)
at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:668)
at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96)
at org.eclipse.tycho.p2.remote.RemoteMetadataRepositoryManager.loadRepository(RemoteMetadataRepositoryManager.java:61)
at org.eclipse.tycho.p2.remote.RemoteMetadataRepositoryManager.loadRepository(RemoteMetadataRepositoryManager.java:53)
at org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl.loadMetadataRepository(TargetPlatformFactoryImpl.java:298)
... 21 more
Caused by: org.eclipse.equinox.p2.core.ProvisionException: No repository found at http://ghillairet.github.com/p2/releases/emfjson/0.14.0.
at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.fail(AbstractRepositoryManager.java:395)
at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:692)
at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96)
at org.eclipse.tycho.p2.remote.RemoteMetadataRepositoryManager.loadRepository(RemoteMetadataRepositoryManager.java:61)
at org.eclipse.tycho.p2.remote.RemoteMetadataRepositoryManager.loadRepository(RemoteMetadataRepositoryManager.java:53)
at org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository.addChild(CompositeMetadataRepository.java:166)
... 30 more
I tried it with both Maven 3.0.5 and 3.3.9.
How to handle inter model references?
EMF allows references between objects contained in different resources. Resolution of references is done through EMF proxies URIs. The URI contains the location of the target resource and the location of the target object in that resource.
In emftriple, a resource is a named graph (or simply graph) associated to a rdf store. Inter-model references in emftriple means that proxies should contains the location of the named graph and the location of the object's RDF URI.
Inter-model references should also be used to navigate in the Web of Data by deresolving URIs.
Execution of example ends in a null pointer exception.
Exception in thread "main" java.lang.NullPointerException
at org.eclipse.emf.ecore.util.EcoreUtil.create(EcoreUtil.java:3247)
at com.emftriple.sail.SailResourceImpl.load(SailResourceImpl.java:94)
at
com.emftriple.resource.ETripleResourceImpl.load(ETripleResourceImpl.java:
101)
at
org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoad(ResourceSetI mpl.java:
255)
at
org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(Resour ceSetImpl.java:
270)
at
org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSet Impl.java:
397)
at com.emftriple.examples.basic.Main.main(Main.java:60)
Proxy URIs should be formed of the URIs of the resource containing the proxy object, and for fragment the URI of the corresponding RDF resource.
Enable reading RDFa from HTML pages. Can be done with https://github.com/shellac/java-rdfa that creates a Jena Model from the RDFa contains in a HTML page.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.