SlideShare a Scribd company logo
A Common Graph
                      Database Access Layer
                                                          for .NET and Mono




Achim Friedland <achim@graph-database.org>, Aperis GmbH                       FOSDEM 2011 - Mono devroom
Graphs




Any structure having vertices and edges...
                                             2
...but different representations possible.




Adjacency matrix vs. Incidence matrix vs. Adjacency list vs.
Edge list vs. Classes, Index-based vs. Index-free Adjacency,
Dense vs. Sparse graphs, On-disc vs. In-memory graphs...

                                                               3
The problem...

• Different graph representations...
  • have different levels of expressivity
  • can be very application specific
  • hard to optimize a single one for every
      use-case
•   Multiple APIs from different vendors


                                              4
So, where to find a common API?




                                 5
Graph Commons

• Edges are first-class citizens
• Information gathering by traversing
  Indices are less important than in relational DBs

• Index-free adjacency, so the cost of
  traversing an edge is in-depended from the
  size of the graph
  ( ...at least when you ignore the GC ;)




                                                      6
The Property-Graph Model
               The most common graph model within
                    the NoSQL GraphDB space

                                             edge label
              Id: 1                                         Id: 2
                                  Friends
         name: Alice                                      name: Bob
                             since: 2009/09/21
             age: 21                                       age: 23
                                  edge
  vertex
                                properties
properties

•   directed:          Each edge has a source and destination vertex
•   attributed:        Vertices and edges carry key/value pairs
•   edge-labeled:      The label denotes the type of relationship
•   multi-graph:       Multiple edges between any two vertices allowed
                                                                         7
A Property Graph Model Interface for .NET and Mono

// Use a class-based in-memory graph
var graph = new InMemoryGraph();

var v1 = graph.AddVertex(new VertexId(1));
var v2 = graph.AddVertex(new VertexId(2));
v1.SetProperty("name", "Alice");
v1.SetProperty("age" , 21);
v2.SetProperty("name", "Bob");
v2.SetProperty("age" , 23);

var e1 = graph.AddEdge(v1, v2, new EdgeId(1), "Friends");
e1.SetProperty(“since”, ”2009/09/21”);



                                                            8
Or, if you prefer the Dynamic Language Runtime...

// Use a class-based in-memory graph
var graph = new InMemoryGraph();

var v1    = graph.AddVertex().AsDynamic();
var v2    = graph.AddVertex().AsDynamic();
v1.name   = "Alice";
v1.age    = 21;
v2.name   = "Bob";
v2.age    = 23;

var e1 = graph.AddEdge(v1, v2, "Friends").AsDynamic();
e1.since = ”2009/09/21”;



                                                         9
Current status...


• About 70% of the current JAVA original
• e.g. Transactions, Auto-Indexing still missing
• Expect first release within the next 4-6 weeks




                                                   10
The future...

• Different implementations for different
  graph representations
• Implementations for remote graphs
  (Rexster and Neo4J REST in separate projects)

• Extensions, e.g. for semantic graphs



                                                  11
Ok, but how to query a property-
            graph?




                                   12
A data flow framework for property graph models

                          : IEnumerator<E>, IEnumerable<E>




      S            AbstractPipe<S, E>                        E

Source Elements                                    Emitted Elements




                                                                      13
A simple pipe yielding all objects without modification

public class IdentityPipe<S> : AbstractPipe<S, S> {
    public override Boolean MoveNext() {
        if (_InternalEnumerator == null)
            return false;
        if (_InternalEnumerator.MoveNext()) {
            _CurrentElement = _InternalEnumerator.Current;
            return true;
        }
        return false;
    }
}




                                                             14
A simple pipe yielding all strings turned to uppercase

public class ToUpperPipe<String> : AbstractPipe<String, String> {
     public override Boolean MoveNext() {
         if (_InternalEnumerator == null)
             return false;
         if (_InternalEnumerator.MoveNext()) {
             _CurrentElement = _InternalEnumerator.Current.ToUpper();
             return true;
         }
         return false;
     }
}




                                                                        15
A simple pipe yielding the vertex property “name”

public class GetNameProperty : AbstractPipe<IVertex, String> {
    public override Boolean MoveNext() {
        if (_InternalEnumerator == null)
            return false;
        if (_InternalEnumerator.MoveNext()) {
            _CurrentElement = _IVertex.GetProperty(“name”);
            return true;
        }
        return false;
    }
}




                                                                 16
Allow the creation of state or side effects within a pipe




   S       ISideEffectPipe<in S, out E, out T>               E
 Source                                                   Emitted
Elements                       T                          Elements

                           Side Effect



                                                                     17
Count the total number of elements passed through the pipe

public class CountPipe<S> : AbstractPipe<S,S>, ISideEffectPipe<S,S,Int64 {
    [...]
    public override Boolean MoveNext() {
          if (_InternalEnumerator == null)
              return false;
          if (_InternalEnumerator.MoveNext()) {
              _CurrentElement = _InternalEnumerator.Current;
              Interlocked.Increment(ref _Counter);
              return true;
          }
          return false;
      }
      public Int64 SideEffect { get { return _Counter; }}
}


                                                                             18
Create complex pipes by combining pipes to pipelines




   S                      Pipeline<S, E>                 E
             pipe1<S,A>     pipe2<B,C>   pipe3<C,E>
 Source                                               Emitted
Elements                                              Elements




                                                                 19
A data flow framework for property graph models

// Friends-of-a-friend
var pipe1 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES);
var pipe2 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS);
var pipe3 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX);
var pipe4 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES);
var pipe5 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS);
var pipe6 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX);
var pipe7 = new PropertyPipe("name");

var pipeline = new Pipeline(pipe1,pipe2,pipe3,pipe4,pipe5,pipe6,pipe7);
pipeline.SetSource(new SingleEnumerator(
                   graph.GetVertex(new VertexId(1))));

foreach (var _foaf in pipeline.Take(5)) {
  Console.WriteLine(_foaf);
}



                                                                          20
A data flow framework for property graph models



• Think of “LINQ for graphs”
• ...but without the syntactic sugar.
• Very Powerful, but also very “noisy” :(



                                                    21
Current status & the future



• About 95% of the current JAVA original
• Expect first release with the next weeks




                                            22
And what about ad hoc querying for
   exploring a property-graph?




                                     23
Ad hoc Query Language for graphs




• Ad Hoc querying a property graph
• User-friendly wrapper around pipes
• “perl for graphs” ;)



                                           24
Ad hoc Query Language for graphs

// Friends-of-a-friend
var pipe1 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES);
var pipe2 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS);
var pipe3 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX);
var pipe4 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES);
var pipe5 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS);
var pipe6 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX);
var pipe7 = new PropertyPipe("name");

var pipeline = new Pipeline(pipe1,pipe2,pipe3,pipe4,pipe5,pipe6,pipe7);
pipeline.SetSource(new SingleEnumerator(
                   graph.GetVertex(new VertexId(1))));



       g:id-v(1)/outE[@label='Friends']/inV/outE
             [@label='Friends']/inV/@name
                                                                          25
Current status & the future



• Reimplementation not yet started :(
• Will probably be based on the DLR
• Expect first release with the next 2-3 months




                                                 26
But...



• Do not expect Gremlin as the one-and-only
  query language for each use-case!
• More application specific Query Languages
  could be implemented using pipes
  e.g. sones GQL, OrientDB SQL




                                              27
How to access a remote graph?
How to expose a graph via the network?




                                         28
A HTTP/REST interface for
            Blueprints Property Graph Models


• Exposes your application-embedded Blueprints
 graph via HTTP/REST
• Vertices and edges are REST resources
• The rexster client library allows you to access most
 JAVA-based GraphDBs
 Neo4J, OrientDB available; DEX, InfiniteGraph coming soon...



                                                               29
Common CRUD Operations...




                            30
Common CRUD Operations...




                            31
Common CRUD Operations...




                            32
Default resource representation: JSON


curl -H Accept:application/json http://localhost:8182/graph1/vertices/1
{
  "version" : "0.1",
  "results" : {
     "_type" : "vertex",
     "_id"   : "1",
     "name" : "Alice",
     "age"   : 21
  },
  "query_time" : 0.014235
}




                                                                          33
Current status



• About 60% of the current JAVA original
• Expect first release with the next 3-4 weeks
• Rexster Shell might take some more time...




                                                34
Future Resource Representations


• Link-aware, self-describing hypermedia (see Neo4J)
   • e.g. ATOM, XML + XLINK, RDFa
• Application specific protocols
   • GEXF for exporting a graph to GEPHI
   • GraphML/GDF/... graph formats
   • MediaRSS your photo graph traversal via Cooliris


                                                        35
The GraphDB Graph...

          OrientDB for Documents    ThinkerGraph &
                                   Gremlin for Ad Hoc


InfiniteGraph for                                   Neo4J for GIS
   Clustering




  InfoGrid for WebApps                    In-Memory for
                                             Caching



      OrientDB for Ad Hoc
                                             Neo4J for HA

                                                               36
Still hungry for more?


FOSDEM 2011 GraphDB dinner!
Meet us in front of Le Roy d’Espagne
Grand Place 1, Brussels
20:00 PM




                                       37
Questions?

 http://www.graph-database.org
http://www.twitter.com/graphdbs




                                  38

More Related Content

PDF
Functional Programming in Scala: Notes
PDF
Liszt los alamos national laboratory Aug 2011
PDF
Functional Programming Patterns for the Pragmatic Programmer
PDF
Functional Programming in Scala
PDF
Programming in Scala: Notes
PPTX
Summary of C++17 features
PPT
What's New in C++ 11?
PDF
Ankara Jug - Practical Functional Programming with Scala
Functional Programming in Scala: Notes
Liszt los alamos national laboratory Aug 2011
Functional Programming Patterns for the Pragmatic Programmer
Functional Programming in Scala
Programming in Scala: Notes
Summary of C++17 features
What's New in C++ 11?
Ankara Jug - Practical Functional Programming with Scala

What's hot (18)

KEY
Scala: functional programming for the imperative mind
PPTX
Systematic Generation Data and Types in C++
PPTX
C++ 11 Features
PPTX
The Style of C++ 11
PDF
Modern C++
PPTX
C++11: Feel the New Language
PDF
Introduction to Functional Programming with Scala
PPTX
Fun with Lambdas: C++14 Style (part 2)
PDF
Introduction to programming in scala
PPT
Gentle introduction to modern C++
PDF
Pragmatic Real-World Scala (short version)
PPTX
PDF
Practical Aggregate Programming in Scala
PDF
Modern c++ (C++ 11/14)
PPTX
PPTX
C++ Generators and Property-based Testing
PDF
Functional programming in Scala
PPTX
Smart pointers
Scala: functional programming for the imperative mind
Systematic Generation Data and Types in C++
C++ 11 Features
The Style of C++ 11
Modern C++
C++11: Feel the New Language
Introduction to Functional Programming with Scala
Fun with Lambdas: C++14 Style (part 2)
Introduction to programming in scala
Gentle introduction to modern C++
Pragmatic Real-World Scala (short version)
Practical Aggregate Programming in Scala
Modern c++ (C++ 11/14)
C++ Generators and Property-based Testing
Functional programming in Scala
Smart pointers
Ad

Viewers also liked (20)

PDF
Mongo db administration guide
PPTX
StratioDeep: an Integration Layer Between Spark and Cassandra - Spark Summit ...
PPS
Access Control for RDF graphs using Abstract Models
PPTX
Webinar: Compliance and Data Protection in the Big Data Age: MongoDB Security...
PDF
RDF4U: RDF Graph Visualization by Interpreting Linked Data as Knowledge
PPTX
Ops Jumpstart: MongoDB Administration 101
PDF
Tutorial for RDF Graphs
PPTX
Saveface - Save your Facebook content as RDF data
PPT
Graph-based Relational Data Visualization
PDF
Two graph data models : RDF and Property Graphs
PPTX
RDF2Vec: RDF Graph Embeddings for Data Mining
PDF
Cassandra at NoSql Matters 2012
PDF
Cassandra Community Webinar: From Mongo to Cassandra, Architectural Lessons
KEY
Strategies for Distributed Data Storage
KEY
Introduction to Cassandra: Replication and Consistency
PPTX
SPARQL Cheat Sheet
PPTX
Database security
PDF
Cassandra By Example: Data Modelling with CQL3
PDF
Cloudian at cassandra conference in tokyo
PDF
Titan: The Rise of Big Graph Data
Mongo db administration guide
StratioDeep: an Integration Layer Between Spark and Cassandra - Spark Summit ...
Access Control for RDF graphs using Abstract Models
Webinar: Compliance and Data Protection in the Big Data Age: MongoDB Security...
RDF4U: RDF Graph Visualization by Interpreting Linked Data as Knowledge
Ops Jumpstart: MongoDB Administration 101
Tutorial for RDF Graphs
Saveface - Save your Facebook content as RDF data
Graph-based Relational Data Visualization
Two graph data models : RDF and Property Graphs
RDF2Vec: RDF Graph Embeddings for Data Mining
Cassandra at NoSql Matters 2012
Cassandra Community Webinar: From Mongo to Cassandra, Architectural Lessons
Strategies for Distributed Data Storage
Introduction to Cassandra: Replication and Consistency
SPARQL Cheat Sheet
Database security
Cassandra By Example: Data Modelling with CQL3
Cloudian at cassandra conference in tokyo
Titan: The Rise of Big Graph Data
Ad

Similar to Fosdem 2011 - A Common Graph Database Access Layer for .Net and Mono (20)

PDF
1st UIM-GDB - Connections to the Real World
PDF
Scheme on WebAssembly: It is happening!
PDF
Scalable up genomic analysis with ADAM
PDF
Terence Barr - jdk7+8 - 24mai2011
PDF
MapReduce Algorithm Design
PDF
Asynchronous single page applications without a line of HTML or Javascript, o...
PDF
ScaleGraph - A High-Performance Library for Billion-Scale Graph Analytics
PDF
Scala+data
PDF
High-Performance Graph Analysis and Modeling
PDF
Web-Scale Graph Analytics with Apache® Spark™
PDF
Sugar Presentation - YULHackers March 2009
PDF
Java se-7-evolves-toulouse-jug-2001-09-14
PPTX
Hadoop ecosystem
PDF
Accelerating Spark MLlib and DataFrame with Vector Processor “SX-Aurora TSUBASA”
PDF
Hadoop ecosystem
PDF
From Zero to Application Delivery with NixOS
PDF
Big data shim
PDF
Odessapy2013 - Graph databases and Python
PPT
designpatterns_blair_upe.ppt
PDF
Neo4j Morpheus: Interweaving Table and Graph Data with SQL and Cypher in Apac...
1st UIM-GDB - Connections to the Real World
Scheme on WebAssembly: It is happening!
Scalable up genomic analysis with ADAM
Terence Barr - jdk7+8 - 24mai2011
MapReduce Algorithm Design
Asynchronous single page applications without a line of HTML or Javascript, o...
ScaleGraph - A High-Performance Library for Billion-Scale Graph Analytics
Scala+data
High-Performance Graph Analysis and Modeling
Web-Scale Graph Analytics with Apache® Spark™
Sugar Presentation - YULHackers March 2009
Java se-7-evolves-toulouse-jug-2001-09-14
Hadoop ecosystem
Accelerating Spark MLlib and DataFrame with Vector Processor “SX-Aurora TSUBASA”
Hadoop ecosystem
From Zero to Application Delivery with NixOS
Big data shim
Odessapy2013 - Graph databases and Python
designpatterns_blair_upe.ppt
Neo4j Morpheus: Interweaving Table and Graph Data with SQL and Cypher in Apac...

More from Achim Friedland (17)

PPTX
ICNC24 EV OverlayNetworks for reliability, security, privacy
PPTX
RELIABILITY – SECURITY – PRIVACY: EV Overlay Networks - Deep Dive v1.0
PPTX
Enhancing OCPP with E2E-Security and Binary Data Streams for a more Secure En...
PDF
Chaos Communication Congress 2003: Heart of Gold v6
PPTX
Open Source Transparency Software for E-Mobility
PPTX
11. Workshop der Fachgruppe Recht „IKT für Elektromobilität III“ - Chargy Ope...
PPTX
Chargy - E-Mobility Transparency Software
PPTX
Öffentliche Daten nutzen! Nur wie bekommen?
PPTX
Re-Using Open Data for Smart e-Mobility
PPTX
Open Charging Cloud @ E-World 2017 in Essen
PDF
Security and Privacy in the current e-mobility charging infrastructure
PDF
Can the e-Mobility Charging Infrastructure be a Blueprint for other IoT Proje...
PDF
Open Charging Cloud - Manage, Share and Incentivize Open Data
PDF
Towards a Security-aware Network Virtualization
PDF
A Generalized Label-Forwarding Architecture for the Future Internet
PDF
Database Pro Power Days 2010 - Graph data in the cloud using .NET
PDF
NoSQL Frankfurt 2010 - The GraphDB Landscape and sones
ICNC24 EV OverlayNetworks for reliability, security, privacy
RELIABILITY – SECURITY – PRIVACY: EV Overlay Networks - Deep Dive v1.0
Enhancing OCPP with E2E-Security and Binary Data Streams for a more Secure En...
Chaos Communication Congress 2003: Heart of Gold v6
Open Source Transparency Software for E-Mobility
11. Workshop der Fachgruppe Recht „IKT für Elektromobilität III“ - Chargy Ope...
Chargy - E-Mobility Transparency Software
Öffentliche Daten nutzen! Nur wie bekommen?
Re-Using Open Data for Smart e-Mobility
Open Charging Cloud @ E-World 2017 in Essen
Security and Privacy in the current e-mobility charging infrastructure
Can the e-Mobility Charging Infrastructure be a Blueprint for other IoT Proje...
Open Charging Cloud - Manage, Share and Incentivize Open Data
Towards a Security-aware Network Virtualization
A Generalized Label-Forwarding Architecture for the Future Internet
Database Pro Power Days 2010 - Graph data in the cloud using .NET
NoSQL Frankfurt 2010 - The GraphDB Landscape and sones

Recently uploaded (20)

PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
MYSQL Presentation for SQL database connectivity
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Cloud computing and distributed systems.
PDF
Machine learning based COVID-19 study performance prediction
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
Machine Learning_overview_presentation.pptx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Empathic Computing: Creating Shared Understanding
Digital-Transformation-Roadmap-for-Companies.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
MYSQL Presentation for SQL database connectivity
NewMind AI Weekly Chronicles - August'25-Week II
Review of recent advances in non-invasive hemoglobin estimation
Dropbox Q2 2025 Financial Results & Investor Presentation
Cloud computing and distributed systems.
Machine learning based COVID-19 study performance prediction
Per capita expenditure prediction using model stacking based on satellite ima...
Chapter 3 Spatial Domain Image Processing.pdf
Unlocking AI with Model Context Protocol (MCP)
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
MIND Revenue Release Quarter 2 2025 Press Release
Assigned Numbers - 2025 - Bluetooth® Document
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Programs and apps: productivity, graphics, security and other tools
Machine Learning_overview_presentation.pptx

Fosdem 2011 - A Common Graph Database Access Layer for .Net and Mono

  • 1. A Common Graph Database Access Layer for .NET and Mono Achim Friedland <achim@graph-database.org>, Aperis GmbH FOSDEM 2011 - Mono devroom
  • 2. Graphs Any structure having vertices and edges... 2
  • 3. ...but different representations possible. Adjacency matrix vs. Incidence matrix vs. Adjacency list vs. Edge list vs. Classes, Index-based vs. Index-free Adjacency, Dense vs. Sparse graphs, On-disc vs. In-memory graphs... 3
  • 4. The problem... • Different graph representations... • have different levels of expressivity • can be very application specific • hard to optimize a single one for every use-case • Multiple APIs from different vendors 4
  • 5. So, where to find a common API? 5
  • 6. Graph Commons • Edges are first-class citizens • Information gathering by traversing Indices are less important than in relational DBs • Index-free adjacency, so the cost of traversing an edge is in-depended from the size of the graph ( ...at least when you ignore the GC ;) 6
  • 7. The Property-Graph Model The most common graph model within the NoSQL GraphDB space edge label Id: 1 Id: 2 Friends name: Alice name: Bob since: 2009/09/21 age: 21 age: 23 edge vertex properties properties • directed: Each edge has a source and destination vertex • attributed: Vertices and edges carry key/value pairs • edge-labeled: The label denotes the type of relationship • multi-graph: Multiple edges between any two vertices allowed 7
  • 8. A Property Graph Model Interface for .NET and Mono // Use a class-based in-memory graph var graph = new InMemoryGraph(); var v1 = graph.AddVertex(new VertexId(1)); var v2 = graph.AddVertex(new VertexId(2)); v1.SetProperty("name", "Alice"); v1.SetProperty("age" , 21); v2.SetProperty("name", "Bob"); v2.SetProperty("age" , 23); var e1 = graph.AddEdge(v1, v2, new EdgeId(1), "Friends"); e1.SetProperty(“since”, ”2009/09/21”); 8
  • 9. Or, if you prefer the Dynamic Language Runtime... // Use a class-based in-memory graph var graph = new InMemoryGraph(); var v1 = graph.AddVertex().AsDynamic(); var v2 = graph.AddVertex().AsDynamic(); v1.name = "Alice"; v1.age = 21; v2.name = "Bob"; v2.age = 23; var e1 = graph.AddEdge(v1, v2, "Friends").AsDynamic(); e1.since = ”2009/09/21”; 9
  • 10. Current status... • About 70% of the current JAVA original • e.g. Transactions, Auto-Indexing still missing • Expect first release within the next 4-6 weeks 10
  • 11. The future... • Different implementations for different graph representations • Implementations for remote graphs (Rexster and Neo4J REST in separate projects) • Extensions, e.g. for semantic graphs 11
  • 12. Ok, but how to query a property- graph? 12
  • 13. A data flow framework for property graph models : IEnumerator<E>, IEnumerable<E> S AbstractPipe<S, E> E Source Elements Emitted Elements 13
  • 14. A simple pipe yielding all objects without modification public class IdentityPipe<S> : AbstractPipe<S, S> { public override Boolean MoveNext() { if (_InternalEnumerator == null) return false; if (_InternalEnumerator.MoveNext()) { _CurrentElement = _InternalEnumerator.Current; return true; } return false; } } 14
  • 15. A simple pipe yielding all strings turned to uppercase public class ToUpperPipe<String> : AbstractPipe<String, String> { public override Boolean MoveNext() { if (_InternalEnumerator == null) return false; if (_InternalEnumerator.MoveNext()) { _CurrentElement = _InternalEnumerator.Current.ToUpper(); return true; } return false; } } 15
  • 16. A simple pipe yielding the vertex property “name” public class GetNameProperty : AbstractPipe<IVertex, String> { public override Boolean MoveNext() { if (_InternalEnumerator == null) return false; if (_InternalEnumerator.MoveNext()) { _CurrentElement = _IVertex.GetProperty(“name”); return true; } return false; } } 16
  • 17. Allow the creation of state or side effects within a pipe S ISideEffectPipe<in S, out E, out T> E Source Emitted Elements T Elements Side Effect 17
  • 18. Count the total number of elements passed through the pipe public class CountPipe<S> : AbstractPipe<S,S>, ISideEffectPipe<S,S,Int64 { [...] public override Boolean MoveNext() { if (_InternalEnumerator == null) return false; if (_InternalEnumerator.MoveNext()) { _CurrentElement = _InternalEnumerator.Current; Interlocked.Increment(ref _Counter); return true; } return false; } public Int64 SideEffect { get { return _Counter; }} } 18
  • 19. Create complex pipes by combining pipes to pipelines S Pipeline<S, E> E pipe1<S,A> pipe2<B,C> pipe3<C,E> Source Emitted Elements Elements 19
  • 20. A data flow framework for property graph models // Friends-of-a-friend var pipe1 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES); var pipe2 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS); var pipe3 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX); var pipe4 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES); var pipe5 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS); var pipe6 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX); var pipe7 = new PropertyPipe("name"); var pipeline = new Pipeline(pipe1,pipe2,pipe3,pipe4,pipe5,pipe6,pipe7); pipeline.SetSource(new SingleEnumerator( graph.GetVertex(new VertexId(1)))); foreach (var _foaf in pipeline.Take(5)) {   Console.WriteLine(_foaf); } 20
  • 21. A data flow framework for property graph models • Think of “LINQ for graphs” • ...but without the syntactic sugar. • Very Powerful, but also very “noisy” :( 21
  • 22. Current status & the future • About 95% of the current JAVA original • Expect first release with the next weeks 22
  • 23. And what about ad hoc querying for exploring a property-graph? 23
  • 24. Ad hoc Query Language for graphs • Ad Hoc querying a property graph • User-friendly wrapper around pipes • “perl for graphs” ;) 24
  • 25. Ad hoc Query Language for graphs // Friends-of-a-friend var pipe1 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES); var pipe2 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS); var pipe3 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX); var pipe4 = new VertexEdgePipe(VertexEdgePipe.Step.OUT_EDGES); var pipe5 = new LabelFilterPipe("Friends", ComparisonFilter.EQUALS); var pipe6 = new EdgeVertexPipe(EdgeVertexPipe.Step.IN_VERTEX); var pipe7 = new PropertyPipe("name"); var pipeline = new Pipeline(pipe1,pipe2,pipe3,pipe4,pipe5,pipe6,pipe7); pipeline.SetSource(new SingleEnumerator( graph.GetVertex(new VertexId(1)))); g:id-v(1)/outE[@label='Friends']/inV/outE [@label='Friends']/inV/@name 25
  • 26. Current status & the future • Reimplementation not yet started :( • Will probably be based on the DLR • Expect first release with the next 2-3 months 26
  • 27. But... • Do not expect Gremlin as the one-and-only query language for each use-case! • More application specific Query Languages could be implemented using pipes e.g. sones GQL, OrientDB SQL 27
  • 28. How to access a remote graph? How to expose a graph via the network? 28
  • 29. A HTTP/REST interface for Blueprints Property Graph Models • Exposes your application-embedded Blueprints graph via HTTP/REST • Vertices and edges are REST resources • The rexster client library allows you to access most JAVA-based GraphDBs Neo4J, OrientDB available; DEX, InfiniteGraph coming soon... 29
  • 33. Default resource representation: JSON curl -H Accept:application/json http://localhost:8182/graph1/vertices/1 { "version" : "0.1", "results" : { "_type" : "vertex", "_id" : "1", "name" : "Alice", "age" : 21 }, "query_time" : 0.014235 } 33
  • 34. Current status • About 60% of the current JAVA original • Expect first release with the next 3-4 weeks • Rexster Shell might take some more time... 34
  • 35. Future Resource Representations • Link-aware, self-describing hypermedia (see Neo4J) • e.g. ATOM, XML + XLINK, RDFa • Application specific protocols • GEXF for exporting a graph to GEPHI • GraphML/GDF/... graph formats • MediaRSS your photo graph traversal via Cooliris 35
  • 36. The GraphDB Graph... OrientDB for Documents ThinkerGraph & Gremlin for Ad Hoc InfiniteGraph for Neo4J for GIS Clustering InfoGrid for WebApps In-Memory for Caching OrientDB for Ad Hoc Neo4J for HA 36
  • 37. Still hungry for more? FOSDEM 2011 GraphDB dinner! Meet us in front of Le Roy d’Espagne Grand Place 1, Brussels 20:00 PM 37