SlideShare ist ein Scribd-Unternehmen logo
1 von 79
Downloaden Sie, um offline zu lesen
Maciek
Próchniak
Jak udawać
że nie mamy
bazy danych
Oracle view
DDD/OOP view
Larry
Uncle Bob
Repozytorium?
public interface Repository<T> {
void save(T object);
Collection<T> loadAll();
T load(Id id);
}
Repozytorium?
public interface Repository<Presentation> {
Collection<Presentation>
findByCategoryWithPopularityGreaterThan
(String name, double popularity, int limit);
...
}
Zapytania też
mogą być
logiką!
Dashboard
Kolekcje - Java
Collection<Presentation> ret =
new HashSet<Presentation>();
for (Presentation presentation : presentations) {
if (presentation.getPopularity() > popularity) {
for (Author author : authors) {
if (author.getName().equals(name)
&& author.getId()
== presentation.getAuthorId() ) {
ret.add(presentation);
}
}
}
}
return ret;
Techniki
● JDBC
● i(my??)Batis
● Hibernate/JPA
● Hades
● SpringData
● jOOQ
● OneWEBSQL
Object/Relational Mapping
is the Vietnam of Computer Science
- Ted Neward
ORM - OMG
- Rich Hickey
SQL?
SELECT p.* from
PRESENTATIONS p, AUTHORS a
where p.authorId = a.id
and p.popularity > :popularity
and a.name = :name
SQL - kompozycja???
???
.Net
LINQ makes a query
a first-class language construct
in C# and Visual Basic.
var results = from c in Suppliers
where c.size < 1
select new {c.name, c.address};
JVM?
map
tasks
:List[Task]
convert
:Task->View
tasks.map(convert) : List[View]
flatMap
tasks
:List[Task]
createSubtasks
:Task->List[Task]
tasks.flatMap(createSubtasks)
:List[Task]
Kolekcje - Scala!
presentations.flatMap(presentation =>
authors
.filter(author =>
author.id == presentation.authorId)
.filter(author => author.name == name
&& presentation.popularity > popularity)
.map(_ => presentation)
)
Kolekcje - Scala!
for {
presentation <- presentations
author <- authors
if (author.id == presentation.authorId)
if (author.name == name &&
presentation.popularity > popularity)
} yield presentation
SQL - Scala
SELECT p.* from
PRESENTATIONS p
for {
p <- presentations
} yield p
Filtrowanie
SELECT p.* from
PRESENTATIONS p
WHERE p.rank > 5
for {
p <- presentations
if p.rank > 5
} yield p
Projekcja
SELECT p.name from
PRESENTATIONS p
WHERE p.rank > 5
for {
p <- presentations
if p.rank > 5
} yield p.name
Join
SELECT p.name,a.name
from
PRESENTATIONS p,
AUTHORS a
WHERE
p.authorId = a.id
for {
p <- presentations
a <- authors
if
(p.authorId==a.id)
} yield
(p.name,a.name)
InnerJoin
SELECT p.name,a.name
from
PRESENTATIONS p,
INNER JOIN AUTHORS a
ON
p.authorId = a.id
for {
p <- presentations
a <-
authors(p.authorId)
} yield
(p.name,a.name)
Order by, limit
SELECT p.* from
PRESENTATIONS p
order by p.name
limit 10
(for {
p <- presentations
} yield p)
.sortBy(_.name)
.take(10)
Deklaratywność w Scali
tasks
.map(_.name)
.filter(_.priority > 4)
.take(3)
● Statyczne typowanie
● Deklaratywność
● Predykaty = wyrażenia Scali
● Standardowe API - (flat)Map
Logika DAO DB
findByNameOrderByType
findByTypeGroupByCategory
...
Logika DAO DB
query
???
Scala
Language
Integrated
Connectivity
Kit
Play!
Akka
Slick
Scala
Typesafe
Slick
● Obsługa różnych baz
● Łatwa konfiguracja
● DML
● Ochrona przed SQL injection
● bla
● bla
● bla
zapytania
~
operacje na kolekcjach
Scali
SLICK - architektura
AST
H2MySQL
Lifted
Lifted - predykaty
for {
speaker <- Query(Speakers)
if (speaker.name startsWith "Maciek")
} yield (speaker.twitter)
Lifted - metadane
object Speakers extends Table[Speaker]("speakers") {
def id = column[Long]("id")
def name = column[String]("name")
def twitter = column[TwitterId]("twitterId")
def * = id ~ name ~ twitter <> (
Speaker.apply _, Speaker.unapply _)
}
Lifted - predykaty
for {
speaker <- Query(Speakers)
if (speaker.name startsWith "Maciek")
} yield (speaker.twitter)
abstract class Query[+E, U] {
def flatMap[F, T](f: E => Query[F, T]): Query[F, T] = ...
def map[F, G, T](f: E => F)
(implicit shape: Shape[F, T, G]): Query[G, T] = ...
def filter[T](f: E => T)
(implicit wt: CanBeQueryCondition[T]): Query[E, U]
}
trait UnitInvoker[+R] extends Invoker[Unit, R] {
final def list()(implicit session: JdbcBackend#Session): List[R]
final def first()(implicit session: JdbcBackend#Session) : R
final def foreach(f: R => Unit, maxRows: Int)
(implicit session: JdbcBackend#Session): Unit
....
}
Lifted - predykaty
for {
speaker <- Query(Speakers)
if (speaker.name startsWith "Mac")
} yield (speaker.twitter)
===
=!=
notNull
Lifted - predykaty
for {
speaker <- Query(Speakers)
if (speaker.name startsWith "Mac")
} yield (speaker.twitter)
Rep[String]
Rep[TwitterId]
Rep[String]
Lifted - Join
for {
(s,p) <- Query(Speakers)
innerJoin Presentations
on (_.id === _.authorId)
} yield (s.twitter,p.abstr)
Lifted - własne typy
case class TwitterId(id:String) extends AnyVal
implicit val twitterId = MappedJdbcType.base[TwitterId,String]
(_.id,TwitterId.apply)
object Speakers extends Table[Speaker]("speakers") {
def twitter = column[TwitterId]("twitterId")
}
Lifted - kompozycja
def filter(pred
:Presentations=>Column[Boolean]) = {
for {
p <- Query(Presentations)
if (pred(p))
} yield (p.id)
}
Lifted - kompozycja
for {
presentation <- Query(Presentations)
author <- presentation.author
if author.name startsWith "Mac"
} yield presentation.title
Lifted - kompozycja
object Presentations
extends Table[Presentation] {
...
def author = foreignKey("author_fk",
authorId, Speakers)(_.id)
}
Lifted - podsumowanie
Czego brakuje lifted?
for {
speaker <- Query(Speakers)
if (speaker.name === "Mac")
} yield (speaker.twitter)
WIP - direct
Makra
● C - syntaktyczne
● Lisp - higieniczne
● Scala 2.10 - typowane
def filter(filter:T => Boolean)
: Queryable[T] =
macro QueryableMacros.filter[T]
def filter[T:c.WeakTypeTag]
(c: scala.reflect.macros.Context)
(projection: c.Expr[T => Boolean]) : c.Expr
[scala.slick.direct.Queryable[T]] = ...
Makro - przykład
.filter(s => s.name == "Henry")
("filter", Supplier, Function( List("s"),
Apply( Select("s", "name"), "==",
List(Literal(Constant("Henry"))))))
("filter", Supplier, Function( List("s"),
Apply( Select("s", "name"), "==",
List(Literal(Constant("Henry"))))))
Slick Query AST
SLICK - architektura
AST
H2MySQL
Lifted Direct
Direct - metadane
@table("presentation")
case class Presentation(@column("id") id:Long,
@column("authorId") authorId:Long,
@column("title") title:String,
@column("abstract")abstr:String)
Direct - przykład
val query = for {
speaker <- Queryable[Speaker]
if speaker.name == "Kuba Nabrdalik"
} yield speaker.bio
Direct - przykład
val backend = new SlickBackend(profile,
AnnotationMapper)
def list[H](query:BaseQueryable[H])
: Iterable[H]
= backend.result(query, session)
dao.list(query) : List[Speaker]
Direct - typesafety :|
for {
presentation <- Queryable[Presentation]
if (presentation.title.contains("scala"))
} yield (presentation.id)
Direct - kompozycja??
def filter(pred:Presentation=>Boolean) = {
for {
p <- Queryable[Presentation]
if (pred(p))
} yield (presentation.id)
}
Slick - architektura
AST
H2MySQL
Lifted Direct
OrientDB
Slick OrientDB
@table("presentation")
case class Presentation(@column("id") id:Long,
@column("title") title:String,
@column("comments") comments:List[Comment])
case class Comment(@column("number") author:String,
@column("rate") rate:Integer,
@column("content") content:String)
Slick OrientDB
for {
presentation <- Queryable[Presentation]
if (presentation.comments
.filter(_.ratio > 5).size > 0)
} yield (presentation.title)
SLICK - architektura
AST
H2MySQL
Lifted Direct
OrientDB
Memory
SLICK - architektura
AST
H2
MySQL
Lifted
18 faz kompilacji...
OrientDBMemory
Direct
there is no valid translation of arbitrary
monadic Query expressions to SQL
(whose semantics are stuck half-way
between applicative functors and
monads)
- Stefan Zeiger
czy to się opłaca?
● Deklaratywne zapytania
● Znane API
● Brak magii
● ... oprócz odrobiny makr
● Skomplikowane :(
http://slick.typesafe.com
https://github.com/slick/slick
https://github.com/mproch/slick-orientdb
Takk/Tänan/Dzięki
* we're hiring :)

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

JavaFX 2.0 With Alternative Languages - JavaOne 2011
JavaFX 2.0 With Alternative Languages - JavaOne 2011JavaFX 2.0 With Alternative Languages - JavaOne 2011
JavaFX 2.0 With Alternative Languages - JavaOne 2011
 
Advanced Query Parsing Techniques
Advanced Query Parsing TechniquesAdvanced Query Parsing Techniques
Advanced Query Parsing Techniques
 
Shrug2017 arcpy data_and_you
Shrug2017 arcpy data_and_youShrug2017 arcpy data_and_you
Shrug2017 arcpy data_and_you
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
The basics and design of lua table
The basics and design of lua tableThe basics and design of lua table
The basics and design of lua table
 
mobl
moblmobl
mobl
 
A bit about Scala
A bit about ScalaA bit about Scala
A bit about Scala
 
Scala for Jedi
Scala for JediScala for Jedi
Scala for Jedi
 
ROracle
ROracle ROracle
ROracle
 
The Ring programming language version 1.9 book - Part 90 of 210
The Ring programming language version 1.9 book - Part 90 of 210The Ring programming language version 1.9 book - Part 90 of 210
The Ring programming language version 1.9 book - Part 90 of 210
 
Map-Reduce and Apache Hadoop
Map-Reduce and Apache HadoopMap-Reduce and Apache Hadoop
Map-Reduce and Apache Hadoop
 
Is there a perfect data-parallel programming language? (Experiments with More...
Is there a perfect data-parallel programming language? (Experiments with More...Is there a perfect data-parallel programming language? (Experiments with More...
Is there a perfect data-parallel programming language? (Experiments with More...
 
Spl Not A Bridge Too Far phpNW09
Spl Not A Bridge Too Far phpNW09Spl Not A Bridge Too Far phpNW09
Spl Not A Bridge Too Far phpNW09
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
Type classes 101 - classification beyond inheritance
Type classes 101 - classification beyond inheritanceType classes 101 - classification beyond inheritance
Type classes 101 - classification beyond inheritance
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
 
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin WayTDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
 
Scala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldScala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereld
 
The Ring programming language version 1.5.1 book - Part 43 of 180
The Ring programming language version 1.5.1 book - Part 43 of 180The Ring programming language version 1.5.1 book - Part 43 of 180
The Ring programming language version 1.5.1 book - Part 43 of 180
 

Andere mochten auch (9)

CQRS, ES, Scala @ Confitura 2012
CQRS, ES, Scala @ Confitura 2012CQRS, ES, Scala @ Confitura 2012
CQRS, ES, Scala @ Confitura 2012
 
Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010
 
Type Driven Development @ Confitura 2014
Type Driven Development @ Confitura 2014Type Driven Development @ Confitura 2014
Type Driven Development @ Confitura 2014
 
TypeSafe NoSQL @ TopConf 2012
TypeSafe NoSQL @ TopConf 2012TypeSafe NoSQL @ TopConf 2012
TypeSafe NoSQL @ TopConf 2012
 
Scalable database, Scalable language @ JDC 2013
Scalable database, Scalable language @ JDC 2013Scalable database, Scalable language @ JDC 2013
Scalable database, Scalable language @ JDC 2013
 
Jee conf 2015
Jee conf 2015Jee conf 2015
Jee conf 2015
 
Type Driven Development @ BoosterConf 2013
Type Driven Development @ BoosterConf 2013Type Driven Development @ BoosterConf 2013
Type Driven Development @ BoosterConf 2013
 
JBoss Drools presentation for Devclub.eu
JBoss Drools presentation for Devclub.euJBoss Drools presentation for Devclub.eu
JBoss Drools presentation for Devclub.eu
 
Jboss drools expert (ru)
Jboss drools expert (ru)Jboss drools expert (ru)
Jboss drools expert (ru)
 

Ähnlich wie Slick @ Confitura 2013

Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
Dmitry Buzdin
 
PofEAA and SQLAlchemy
PofEAA and SQLAlchemyPofEAA and SQLAlchemy
PofEAA and SQLAlchemy
Inada Naoki
 
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
JavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development ExperiencesJavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development Experiences
Peter Pilgrim
 
Scala4sling
Scala4slingScala4sling
Scala4sling
day
 
Lift 2 0
Lift 2 0Lift 2 0
Lift 2 0
SO
 

Ähnlich wie Slick @ Confitura 2013 (20)

Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Scala & sling
Scala & slingScala & sling
Scala & sling
 
Slickdemo
SlickdemoSlickdemo
Slickdemo
 
Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)
 
PofEAA and SQLAlchemy
PofEAA and SQLAlchemyPofEAA and SQLAlchemy
PofEAA and SQLAlchemy
 
icpe2019_ishizaki_public
icpe2019_ishizaki_publicicpe2019_ishizaki_public
icpe2019_ishizaki_public
 
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
 
JavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development ExperiencesJavaCro 2014 Scala and Java EE 7 Development Experiences
JavaCro 2014 Scala and Java EE 7 Development Experiences
 
Scala4sling
Scala4slingScala4sling
Scala4sling
 
Architecting Alive Apps
Architecting Alive AppsArchitecting Alive Apps
Architecting Alive Apps
 
ITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function ProgrammingITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function Programming
 
Introduction to Apache Tajo: Data Warehouse for Big Data
Introduction to Apache Tajo: Data Warehouse for Big DataIntroduction to Apache Tajo: Data Warehouse for Big Data
Introduction to Apache Tajo: Data Warehouse for Big Data
 
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
 
Artigo 81 - spark_tutorial.pdf
Artigo 81 - spark_tutorial.pdfArtigo 81 - spark_tutorial.pdf
Artigo 81 - spark_tutorial.pdf
 
Lift 2 0
Lift 2 0Lift 2 0
Lift 2 0
 
Simple Build Tool Introduction
Simple Build Tool IntroductionSimple Build Tool Introduction
Simple Build Tool Introduction
 
JDK1.7 features
JDK1.7 featuresJDK1.7 features
JDK1.7 features
 
Introduction to meta-programming in scala
Introduction to meta-programming in scalaIntroduction to meta-programming in scala
Introduction to meta-programming in scala
 
Spark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark MeetupSpark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark Meetup
 
Advanced Php - Macq Electronique 2010
Advanced Php - Macq Electronique 2010Advanced Php - Macq Electronique 2010
Advanced Php - Macq Electronique 2010
 

Kürzlich hochgeladen

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 

Kürzlich hochgeladen (20)

OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
ManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide DeckManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide Deck
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 

Slick @ Confitura 2013