<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Datablend &#187; sail</title>
	<atom:link href="https://datablend.be/?cat=24&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://datablend.be</link>
	<description>Big Data Simplified</description>
	<lastBuildDate>Mon, 07 Sep 2015 09:04:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>Visualizing RDF Schema inferencing through Neo4J, Tinkerpop, Sail and Gephi</title>
		<link>https://datablend.be/?p=260</link>
		<comments>https://datablend.be/?p=260#comments</comments>
		<pubDate>Mon, 21 Nov 2011 09:47:11 +0000</pubDate>
		<dc:creator>Davy Suvee</dc:creator>
				<category><![CDATA[gephi]]></category>
		<category><![CDATA[neo4j]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[rdf]]></category>
		<category><![CDATA[sail]]></category>

		<guid isPermaLink="false">http://datablend22.lin3.nucleus.be/?p=260</guid>
		<description><![CDATA[Last week, the Neo4J plugin for Gephi was released. Gephi is an open-source visualization and manipulation tool that allows users to interactively browse and explore graphs. The graphs themselves can be loaded through a variety of file formats. Thanks to Martin Škurla, it is now possible to load and lazily explore graphs that are stored<p><a href="https://datablend.be/?p=260">Continue Reading →</a></p>]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Last week, the <a target='_blank' href="http://neo4j.org">Neo4J</a> <a target='_blank' href="https://gephi.org/plugins/neo4j-graph-database-support/">plugin</a> for <a target='_blank' href="http://gephi.org/">Gephi</a> was released. Gephi is an open-source <span class="highlight">visualization</span> and <span class="highlight">manipulation</span> tool that allows users to <span class="highlight">interactively browse and explore graphs</span>. The graphs themselves can be loaded through a variety of file formats. Thanks to <a target='_blank' href="http://twitter.com/#!/muzPayne">Martin Škurla</a>, it is now possible to load and lazily explore graphs that are stored in a Neo4J data store.</p>
<p style="text-align: justify;">In <a target='_blank' http://datablend.be/?p=554>one of my previous articles</a>, I explained how Neo4J and the <a target='_blank' href="http://tinkerpop.com/">Tinkerpop</a> framework can be used to load and query RDF triples. The newly released Neo4J plugin now allows to visually browse these RDF triples and perform some more fancy operations such as <span class="highlight">finding patterns</span> and <span class="highlight">executing social network analysis algorithms</span> from within Gephi itself. Tinkerpop&#8217;s <a target='_blank' https://github.com/tinkerpop/blueprints/wiki/Sail-Ouplementation>Sail Ouplementation</a> also supports the notion of <a target='_blank' href="http://www-ksl.stanford.edu/software/jtp/doc/owl-reasoning.html">RDF Schema inferencing</a>. Inferencing is the process where new (RDF) data is <span class="highlight">automatically deducted</span> from existing (RDF) data through <span class="highlight">reasoning</span>. Unfortunately, the Sail reasoner cannot easily be integrated within Gephi, as the Gephi plugin grabs a lock on the Neo4J store and no RDF data can be added, except through the plugin itself.</p>
<p style="text-align: justify;">Being able to visualize the RDF Schema reasoning process and graphically indicate which RDF triples were added manually and which RDF data was automatically inferred would be a nice to have. To implement this feature, we should be able to push graph changes from Tinkerpop and Neo4J to Gephi. Luckily, the <a target='_blank' href="https://gephi.org/plugins/graph-streaming/">Gephi graph streaming plugin</a> allows us to do just that. In the rest of this article, I will detail how to setup the required Gephi environment and how we can stream (inferred) RDF data from Neo4J to Gephi.</p>
<p>&nbsp;</p>
<h3>1. Adding the (inferred) RDF data</h3>
<p style="text-align: justify;">Let&#8217;s start by setting up the required Neo4J/Tinkerpop/Sail environment that we will use to store and infer RDF triples. The setup is similar to the one explained in <a target='_blank' http://datablend.be/?p=554>my previous Tinkerpop article</a>. However, instead of wrapping our <em>GraphSail</em> as a <em>SailRepository</em>, we will wrap it as a <em>ForwardChainingRDFSInferencer</em>. This inferencer will listen for RDF triples that are added and/or removed and will automatically execute RDF Schema inferencing, applying the rules as defined by the <a target='_blank' href="http://www.w3.org/TR/2004/REC-rdf-mt-20040210/">RDF Semantics Recommendation</a>.</p>
<script src="https://gist.github.com/1380489.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">We are now ready to add RDF triples. Let&#8217;s create a simple <span class="highlight">loop</span> that allows us to read-in RDF triples and add them to the Sail store.</p>
<script src="https://gist.github.com/1380494.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">The inference method itself is rather simple. We first start by parsing the RDF <span class="highlight">subject</span>, <span class="highlight">predicate</span> and <span class="highlight">object</span>. Next, we start a new transaction, add the statement and commit the transaction. This will not only add the RDF triple to our Neo4J store but will additionally run the RDF Schema inferencing process and automatically add the inferred RDF triples. Pretty easy!</p>
<script src="https://gist.github.com/1380511.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">But how do we retrieve the inferred RDF triples that were added through the inference process? Although the <em>ForwardChainingRDFSInferencer</em> allows us to register a listener that is able to detect changes to the graph, it does not provide the required API to distinct between the <span class="highlight">manually added or inferred RDF triples</span>. Luckily, we can still access the underlying Neo4J store and capture these graph changes by implementing the Neo4J <em>TransactionEventHandler</em> interface. After a transaction is committed, we can fetch the newly created <span class="highlight">relationships</span> (i.e. RDF triples). For each of these relationships, the <span class="highlight">start node</span> (i.e. RDF subject), <span class="highlight">end node</span> (i.e. RFD object) and <span class="highlight">relationship type</span> (i.e. RDF predicate) can be retrieved. In case a RDF triple was added through inference, the value of the boolean property <span class="highlight">&#8220;inferred&#8221;</span> is <span class="highlight">&#8220;true&#8221;</span>. We filter the relationships to the ones that are defined within our domain (as otherwise the full RDFS meta model will be visualized as well). Finally we push the relevant nodes and edges.</p>
<script src="https://gist.github.com/1380584.js"></script>
<p>&nbsp;</p>
<h3>2. Pushing the (inferred) RDF data</h3>
<p style="text-align: justify;">
The streaming plugin for Gephi allows reading and visualizing data that is send to its master server. This master server is a REST interface that is able to receive graph data through a JSON interface. The <em>PushUtility</em> used in the <em>PushTransactionEventHandler</em> is responsible for generating the <a target='_blank' href="http://wiki.gephi.org/index.php/Specification_-_GSoC_Graph_Streaming_API">required JSON edge and node data format</a> and pushing it to the Gephi master.   </p>
<script src="https://gist.github.com/1380606.js"></script>
<p>&nbsp;</p>
<h3>3. Visualizing the (inferred) RDF data</h3>
<p style="text-align: justify;">Start the Gephi Streaming Master server. This will allow Gephi to receive the (inferred) RDF triples that we send it through its REST interface. Let&#8217;s run our Java application and add the following RDF triples:</p>
<script src="https://gist.github.com/1380624.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">The first two RDF triples above state that a <span class="highlight">teacher</span> <span class="highlight">teaches</span> a <span class="highlight">student</span>. The last RDF triple states that <span class="highlight">Davy</span> <span class="highlight">teaches</span> <span class="highlight">Bob</span>. As a result, the RDF Schema inferencer deducts that <span class="highlight">Davy</span> must be a <span class="highlight">teacher</span> and that <span class="highlight">Bob</span> must be a <span class="highlight">student</span>. Let&#8217;s have a look at what Gephi visualized for us.</p>
<p><a target='_blank' href="http://datablend.be/wp-content/uploads/gephi1.jpg">
<p align="center"><img width="550" src="http://datablend.be/wp-content/uploads/gephi1.jpg" alt="gephi" /></p>
<p></a></p>
<p style="text-align: justify;">Mmm &#8230; That doesn’t really look impressive <img src='https://datablend.be/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Let&#8217;s use some formatting. First apply <span class="highlight">Force Atlas lay-outing</span>. Afterwards, scale the edges and enable the labels on both the edges and the nodes. Finally, apply <span class="highlight">partitioning</span> on the edges by coloring the arrows using the <span class="highlight">inferred</span> property on the edges. We can now clearly identify the inferred RDF statements (i.e. Davy being a teacher and Bob being a student).</p>
<p><a target='_blank' href="http://datablend.be/wp-content/uploads/gephi2.jpg">
<p align="center"><img width="550" src="http://datablend.be/wp-content/uploads/gephi2.jpg" alt="gephi" /></p>
<p></a></p>
<p>&nbsp;</p>
<p style="text-align: justify;">Let&#8217;s add some additional RDF triples.</p>
<script src="https://gist.github.com/1380683.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">Basically, these RDF triples state that both <span class="highlight">teacher</span> and <span class="highlight">student</span> are <span class="highlight">subclasses</span> of <span class="highlight">person</span>. As a result, the RDFS inferencer is able to deduct that both <span class="highlight">Davy</span> and <span class="highlight">Bob</span> must be <span class="highlight">persons</span>. The Gephi visualization is updated accordingly.</p>
<p><a target='_blank' href="http://datablend.be/wp-content/uploads/gephi3.jpg">
<p align="center"><img width="550" src="http://datablend.be/wp-content/uploads/gephi3.jpg" alt="gephi" /></p>
<p></a> </p>
<p>&nbsp;</p>
<h3>4. Conclusion</h3>
<p style="text-align: justify;">With just a few lines of code we are able to stream (inferred) RDF triples to Gephi and make use of its powerful visualization and analysis tools to explore and inspect our datasets. As always, the complete source code can be found on the <a target='_blank' href="https://github.com/datablend/blueprints-streaming-sail-inferencing">Datablend public GitHub repository</a>. Make sure to surf the internet to find some other nice Gephi streaming examples, the coolest one probably being <a target='_blank' href="http://www.youtube.com/watch?v=2guKJfvq4uI">the visualization of the Egyptian revolution on Twitter</a>. </p>
<p></p>]]></content:encoded>
			<wfw:commentRss>https://datablend.be/?feed=rss2&#038;p=260</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RDF data in Neo4J: the Tinkerpop story</title>
		<link>https://datablend.be/?p=252</link>
		<comments>https://datablend.be/?p=252#comments</comments>
		<pubDate>Sun, 17 Jul 2011 09:38:11 +0000</pubDate>
		<dc:creator>Davy Suvee</dc:creator>
				<category><![CDATA[neo4j]]></category>
		<category><![CDATA[rdf]]></category>
		<category><![CDATA[sail]]></category>
		<category><![CDATA[tinkerpop]]></category>

		<guid isPermaLink="false">http://datablend22.lin3.nucleus.be/?p=252</guid>
		<description><![CDATA[[information] My previous blog post discussed the use of Neo4J as a RDF triple store. Michael Hunger however informed me that the neo-rdf-sail component is no longer under active development and advised me to have a look at Tinkerpop&#8217;s Sail implementation. [/information] As mentioned in my previous blog post, I recently got asked to implement<p><a href="https://datablend.be/?p=252">Continue Reading →</a></p>]]></description>
				<content:encoded><![CDATA[[information]
<p style="text-align: justify;">My <a target='_blank' href="http://datablend.be/?p=411">previous blog post</a> discussed the use of <a target='_blank' href="http://neo4j.org">Neo4J</a> as a RDF triple store. <a target='_blank' href="http://twitter.com/#!/mesirii">Michael Hunger</a> however informed me that the <a target='_blank' href="http://components.neo4j.org/neo4j-rdf-sail/snapshot">neo-rdf-sail</a> component is no longer under active development and advised me to have a look at <a target='_blank' href="http://www.tinkerpop.com/">Tinkerpop&#8217;s</a> Sail implementation.</p>
[/information]
<p style="text-align: justify;">As mentioned in my <a target='_blank' href="http://datablend.be/?p=411">previous blog post</a>, I recently got asked to implement a storage and querying platform for biological <span class="highlight">RDF</span> (Resource Description Framework) data. Traditional RDF stores are not really an option as my solution should also provide the ability to <span class="highlight">calculate shortest paths</span> between <span class="highlight">random subjects</span>. Calculating shortest path is however one of the strong selling points of <span class="highlight">Graph Databases</span> and more specifically <a target='_blank' href="http://www.neo4j.org">Neo4J</a>. Unfortunately, the <a target='_blank' href="http://components.neo4j.org/neo4j-rdf-sail/snapshot">neo-rdf-sail</a> component, which suits my requirements perfectly, is no longer under active development. <a target='_blank' href="http://www.tinkerpop.com/">Tinkerpop&#8217;s</a> Sail implementation however, fills the void with an even better alternative!</p>
<p>&nbsp;</p>
<h3>1. What is Tinkerpop?</h3>
<p style="text-align: justify;"><a target='_blank' href="http://www.tinkerpop.com/">Tinkerpop</a> is an open source project that provides an entire stack of technologies within the Graph Database space. At the core of this stack is the <a target='_blank' href="https://github.com/tinkerpop/blueprints/wiki">Blueprints</a> framework. Blueprints can be considered as the <span class="highlight">JDBC</span> of Graph Databases. By providing a collection of generic interfaces, it allows to develop graph-based applications, without introducing explicit dependencies on concrete Graph Database implementations. Additionally, Blueprints provides concrete bindings for the Neo4J, <a target='_blank' href=" http://www.orientechnologies.com">OrientDB</a> and <a target='_blank' href=" http://www.sparsity-technologies.com/dex">Dex</a> Graph Databases. On top of Blueprints, the Tinkerpop team developed an entire range of graph technologies, including <a target='_blank' href="https://github.com/tinkerpop/gremlin/wiki">Gremlin</a>, a powerful, domain-specific language designed for traversing graphs. Hence, once a Blueprints binding is available for a particular Graph Database, an entire range of technologies can be leveraged.</p>
<p>&nbsp;</p>
<h3>2. Tinkerpop and Sail</h3>
<p style="text-align: justify;">Last time, I talked about exposing a Neo4J Graph Database (containing RDF triples) through the <em>Sail</em> interface, which is part of the the <em>Sail </em>interface. Once you have your <em>Sail </em> available, storing and querying RDF is analogous to the piece of code shown in my previous blog article.</p>
<script src="https://gist.github.com/1086222.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">The two first lines of code require some more clarification. A <em>TransactionalGraph </em> can be run in <em>MANUAL </em>or <em>AUTOMATIC </em>transaction mode. In <em>AUTOMATIC </em>mode, transactions are basically ignored, in the sense that each <em>item  </em> that gets created is immediately persisted in the underlying Graph Database. Although this fits my needs, <em>AUTOMATIC </em>mode is extremely slow in case of Neo4J because of the continuous IO access. <em>MANUAL </em> mode on the other hand is very fast; a new transaction is created at the moment the import of the RDF data file starts and is only committed to the Neo4J data store once all RDF triples are parsed and created. Unfortunately, <em>MANUAL</em> mode does not scale either in my specific situation; as some of my RDF data files contain over 50 million RDF triples, they can not fit into memory (i.e. Java heap space error). Requiring fast imports, I extended the default Neo4J Blueprints binding to support intermediate commits. I based my implementation on Neo4J&#8217;s best practices for <a target='_blank' href="http://wiki.neo4j.org/content/Transactions#Big_transactions">big transactions</a>. The idea is rather simple: you specify the <span class="highlight">maximum number of  items</span> that can be kept in memory, before they should be committed to the Neo4J data store. Once this number is reached, the current transaction is committed and a new one is automatically started. Simple, but very effective!</p>
<script src="https://gist.github.com/1086243.js"></script>
[information]
<p style="text-align: justify;">Based upon the &#8220;MyNeo4jGraph&#8221;-idea described above, the BluePrints team extended their API to support <b>transaction buffers</b>. More information on its use can be found <a target='_blank' http://groups.google.com/group/gremlin-users/msg/7b73f2e367ef5de5?pli=1">here</a> and <a target='_blank' href="https://github.com/tinkerpop/blueprints/issues/146">here</a>.</p>
[/information]
<p>&nbsp;</p>
<h3>3. Shortest path calculation</h3>
<p style="text-align: justify;">Although Blueprints allows you to abstract away the Neo4J implementation details, it still provides you with access to the raw Neo4J data store if needed. Hence, one can still use the graph algorithms provided in the <a target='_blank' href="http://components.neo4j.org/neo4j-graph-algo/1.4">neo4j-graph-algo</a> component to calculate shortest paths between random subjects. The complete source code can be found on the <a target='_blank' href="https://github.com/datablend/neo4j-sail-test">Datablend public GitHub repository</a>.</p>
<p></p>]]></content:encoded>
			<wfw:commentRss>https://datablend.be/?feed=rss2&#038;p=252</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Storing and querying RDF data in Neo4J through Sail</title>
		<link>https://datablend.be/?p=250</link>
		<comments>https://datablend.be/?p=250#comments</comments>
		<pubDate>Sun, 10 Jul 2011 09:35:25 +0000</pubDate>
		<dc:creator>Davy Suvee</dc:creator>
				<category><![CDATA[neo4j]]></category>
		<category><![CDATA[rdf]]></category>
		<category><![CDATA[sail]]></category>

		<guid isPermaLink="false">http://datablend22.lin3.nucleus.be/?p=250</guid>
		<description><![CDATA[[information] This blog post discusses the use of Neo4J as a RDF triple store. Michael Hunger however informed me that the neo-rdf-sail component is no longer under active development and advised me to have a look at Tinkerpop&#8217;s Sail implementation. Read the updated version of this article here. [/information] 1. Introduction Recently, I got asked<p><a href="https://datablend.be/?p=250">Continue Reading →</a></p>]]></description>
				<content:encoded><![CDATA[[information]
<p style="text-align: justify;">This blog post discusses the use of <a target='_blank' href="http://neo4j.org">Neo4J</a> as a RDF triple store. <a target='_blank' href="http://twitter.com/#!/mesirii">Michael Hunger</a> however informed me that the <a target='_blank' href="http://components.neo4j.org/neo4j-rdf-sail/snapshot">neo-rdf-sail</a> component is no longer under active development and advised me to have a look at <a target='_blank' href="http://www.tinkerpop.com/">Tinkerpop&#8217;s</a> Sail implementation. Read the updated version of this article <a target='_blank' href="http://datablend.be/?p=554">here</a>.</p>
[/information]
<h3>1. Introduction</h3>
<p style="text-align: justify;">Recently, I got asked to implement a storage and querying platform for biological <a target='_blank' href="http://en.wikipedia.org/wiki/Resource_Description_Framework">RDF</a> (Resource Description Framework) data. <span class="highlight">RDF</span> data is a set of statements about resources in the form of <span class="highlight">subject-predicate-object</span> expressions (also referred to as <span class="highlight">triples</span>). Let’s have a look at some simple RDF triples that define ‘me’, Davy Suvee:</p>
<script src="https://gist.github.com/1071734.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">Each <span class="highlight">subject</span> is identified through an <span class="highlight">URI</span> (Uniform Resource Identifier). For instance, I identify myself as being <span class="highlight">http://www.example.org/person/Davy_Suvee</span>. A <span class="highlight">predicate</span>, also identified through an URI, either points to a <span class="highlight">literal</span> value or to a <span class="highlight">concrete</span> object (which is again identified through an URI). In the example above, the <em>first_name</em>, <em>last_name </em>and <em>age </em>predicates all point to a literal value, while the company predicate points to <span class="highlight">http://www.example.org/company/DataBlend</span>, the company I work for. The <em>DataBlend </em>subject also exhibits a number of properties, including <em>name </em>and <em>VAT-number</em>. Today’s <a target='_blank' href="http://en.wikipedia.org/wiki/Triplestore">triplestores</a> allow you to save billions of these triples and information is retrieved through so-called <a target='_blank' href="http://en.wikipedia.org/wiki/SPARQL">SPARQL</a>-queries.  For instance, to retrieve my <em>first name</em> and <em>age</em>, I can use the following SPARQL-query:</p>
<script src="https://gist.github.com/1075417.js"></script>
<p>&nbsp;</p>
<h3>2. Neo4J as a RDF data store</h3>
<p style="text-align: justify;">Similar to SQL, SPARQL provides a set of powerful querying constructs that allow you to declaratively specify your needs. Calculating <span class="highlight">shortest paths</span> between <span class="highlight">random</span> subjects on the contrary, can not easily be accomplished through SPARQL (unless one encodes the specific path structure, which kind of defeats the point). Being able to quickly calculate shortest paths, which is a requirement for the project I&#8217;m implementing, is one of the main selling points of <span class="highlight">Graph Databases</span>. As RDF data can be thought of as a graph, it comes as no surprise that many Graph Databases, including <a target='_blank' href="http://neo4j.org">Neo4J</a>, provide native support for storing and querying RDF data. In case of Neo4J, this is achieved through the use of the <a target='_blank' href="http://components.neo4j.org/neo4j-rdf/snapshot">neo4j-rdf</a>, <a target='_blank' href="http://components.neo4j.org/neo4j-rdf-sparql/snapshot">neo4j-rdf-sparql</a> and <a target='_blank' href="http://components.neo4j.org/neo4j-rdf-sail/snapshot">neo-rdf-sail</a> components. Unfortunately, I couldn&#8217;t find a recent piece of code that details the various steps for automatically importing RDF triple files within Neo4J. Hence, this article. The complete source code can be found on the <a target='_blank' href="https://github.com/datablend/neo4j-sail-test">Datablend public GitHub repository</a>.  </p>
<p>Start by setting up the Neo4J database connection:<br />
<script src="https://gist.github.com/1071821.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">An embedded Neo4J graph database (<em>EmbeddedGraphDatabase</em>) is used for importing 5MB of RDF tuples containing airline flight information. (This example data set was found at <a target='_blank' href="http://www.rdfdata.org/">rdfdata.org</a>, a great resource for some open RDF data sets). In order to easily find back flight information, we fully text-index our RDF triples (through Lucene). Next, we wrap the embedded Neo4J graph database as a <em>VerboseQuadStore </em>(one of internal triples store implementations provided by Neo4J). Finally, we expose our triple store through the <em>Sail </em>interface, which is part of the <a target='_blank' href="http://www.openrdf.org">openrdf.org</a> project. By doing so, we can use an entire range of RDF utilities (parsers and query evaluators) that are part of the openrdf.org project. Once we have a sail connection available, we can import the required RDF triples through the <em>add</em>-method. </p>
<script src="https://gist.github.com/1072410.js"></script>
<p>&nbsp;</p>
<p style="text-align: justify;">That&#8217;s it! Once the import is finished, you can query your RDF triplets by executing a SPARQL-query. The query below for instance, will retrieve the <em>flight number</em>, <em>departure</em> and <em>destination city</em> of all flights that have a duration of 1 hour and 35 minutes.</p>
<script src="https://gist.github.com/1072438.js"></script>
<p>&nbsp;</p>
<h3>3. Shortest path calculation</h3>
<p style="text-align: justify;">Through the <em>SimpleFulltextIndex</em> we can easily find back the Neo4J node equivalent of a particular RDF subject. Once we got hold of the required nodes, we can use the graph algorithms provided in the <a target='_blank' href="http://components.neo4j.org/neo4j-graph-algo/1.4/">neo4j-graph-algo</a> component to calculate (shortest) paths. Very cool!</p>
<p></p>]]></content:encoded>
			<wfw:commentRss>https://datablend.be/?feed=rss2&#038;p=250</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
