<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to KB</title><link>https://sourceforge.net/p/arcomem/wiki/KB/</link><description>Recent changes to KB</description><atom:link href="https://sourceforge.net/p/arcomem/wiki/KB/feed" rel="self"/><language>en</language><lastBuildDate>Wed, 26 Feb 2014 23:49:15 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/arcomem/wiki/KB/feed" rel="self" type="application/rss+xml"/><item><title>KB modified by John Arcoman</title><link>https://sourceforge.net/p/arcomem/wiki/KB/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -1,6 +1,6 @@
 # Knowledge base

-The knowledge base is implemented on top of ARCOMEM\'s scalable HBase triple
+The knowledge base is implemented on top of ARCOMEM's scalable HBase triple
 store: [H2RDF](http://code.google.com/p/h2rdf/). The high level functions to
 query it are in the `rdfstore` project. It is implemented in Java, with a
 Python binding, and released under GPLv3.
@@ -16,9 +16,8 @@

 # Set up

-H2RDF relies on [HBase and Zookeeper](HadoopHBase). It was tested with
+H2RDF relies on [HBase](HadoopHBase) and Zookeeper. It was tested with
 Zookeeper 3.4.3.
-

 To execute SPARQL queries, go to your master server and start a zookeeper
 Quorum by running:
@@ -28,17 +27,16 @@

 In all worker nodes run (replacing $master with the master host):

+    hdfs dfs -mkdir /user/hbase/bulkAPITriples
+    hdfs dfs -chmod 777 /user/hbase/bulkAPITriples
+    tar xzf ApiCalls.tgz
     hadoop jar H2RDF.jar concurrent.SyncPrimitive qTest $master c

-For a one-node deployment, use:
-
-    hadoop jar H2RDF.jar gr.ntua.h2rdf.concurrent.SyncPrimitive qTest localhost c
-
 where masterDNS is the DNS name of your zookeeper master node.

 To import RDF data, upload your ntriples file to HDFS and run

-    bin/hadoop jar H2RDF.jar sampler.SamplerEx input_path HBaseTable
+    hadoop jar H2RDF.jar sampler.SamplerEx input_path HBaseTable

 For more information, see
 [the public repository](http://code.google.com/p/h2rdf/).
@@ -76,12 +74,12 @@

 ![H2RDF's Architecture](h2rdf.png "H2RDF's Architecture")

-The figure above presents an overview of H2RDF\'s architecture. The system
+The figure above presents an overview of H2RDF's architecture. The system
 imports RDF triples into 3 different HBase indices, using either the HBase
 API or highly efficient, Map-Reduce, bulk import jobs.

 Users are able to execute multiple SPARQL queries over the imported data which are parsed by
-Jena\'s SPARQL parser to ensure syntax correctness and create the query graph.
+Jena's SPARQL parser to ensure syntax correctness and create the query graph.
 Our Join Planner iterates over the query graph and greedily chooses the join
 that needs to be executed, considering the selectivity and cost of all possible
 joins. Joins are executed by the Join Executor module that decides which
@@ -95,7 +93,7 @@
 great query throughput by utilizing all cluster resources, especially in
 the case of centralised joins.

-H2RDF utilises a \'zookeeper quorum\' (a replicated key-value store) in order
+H2RDF utilises a 'zookeeper quorum' (a replicated key-value store) in order
 to offer a multi-language client API and schedule client requests to the
 available server resources. Apache Zookeeper provides a good solution because, primarily,
 it offers a way to handle synchronisation in distributed environments and also
@@ -252,6 +250,12 @@
 `src/main/python`. The library modules come with an example of how to create an
 ICS (`ics_example.py`) or call statistics functions (`api_examples.py`).

+It requires the `python-zookeeper` package, not available for Squeeze. You can
+force the installation of the Wheezy packages, after getting them from the
+Debian site or in our `quick_start` repository:
+
+    dpkg -i --force-depends cdh4-repository_1.0_all.deb libzookeeper-mt2_3.3.5+dfsg1-2_amd64.deb python-zookeeper_3.3.5+dfsg1-2_amd64.deb
+
 For instance, to create an ICS, edit the ICS in `ics_example.py`, update the
 Zookeeper server and port if needed, and run it:

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">John Arcoman</dc:creator><pubDate>Wed, 26 Feb 2014 23:49:15 -0000</pubDate><guid>https://sourceforge.net777017b10a5cfdf47a0eb104c2d34c89580e9c22</guid></item><item><title>KB modified by John Arcoman</title><link>https://sourceforge.net/p/arcomem/wiki/KB/</link><description>&lt;div class="markdown_content"&gt;&lt;h1 id="knowledge-base"&gt;Knowledge base&lt;/h1&gt;
&lt;p&gt;The knowledge base is implemented on top of ARCOMEM\'s scalable HBase triple&lt;br /&gt;
store: &lt;a class="" href="http://code.google.com/p/h2rdf/" rel="nofollow"&gt;H2RDF&lt;/a&gt;. The high level functions to&lt;br /&gt;
query it are in the &lt;code&gt;rdfstore&lt;/code&gt; project. It is implemented in Java, with a&lt;br /&gt;
Python binding, and released under GPLv3.&lt;/p&gt;
&lt;p&gt;The Knowledge Base provides storing, indexing and retrieving mechanisms for all&lt;br /&gt;
the semantic data produced and utilised by the rest of the architectural&lt;br /&gt;
components. More specifically, it appropriately indexes and stores RDF triples&lt;br /&gt;
that derive from the annotation of Web Objects, as performed by the online and&lt;br /&gt;
the offline processing modules and offers SPARQL querying capabilities while&lt;br /&gt;
maintaining scalability and high-performance characteristics.&lt;/p&gt;
&lt;p&gt;It can be accessed using its Java or &lt;a class="" href="#Python-interface"&gt;python API&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="set-up"&gt;Set up&lt;/h1&gt;
&lt;p&gt;H2RDF relies on &lt;a class="" href="/p/arcomem/wiki/HadoopHBase/"&gt;HBase and Zookeeper&lt;/a&gt;. It was tested with&lt;br /&gt;
Zookeeper 3.4.3.&lt;/p&gt;
&lt;p&gt;To execute SPARQL queries, go to your master server and start a zookeeper&lt;br /&gt;
Quorum by running:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;tar&lt;/span&gt; &lt;span class="n"&gt;xzf&lt;/span&gt; &lt;span class="n"&gt;zookeeper&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.4.3&lt;/span&gt;&lt;span class="n"&gt;_light&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;span class="n"&gt;zookeeper&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.4.3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zkServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In all worker nodes run (replacing $master with the master host):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;hadoop&lt;/span&gt; &lt;span class="n"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;H2RDF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;concurrent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SyncPrimitive&lt;/span&gt; &lt;span class="n"&gt;qTest&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For a one-node deployment, use:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;hadoop&lt;/span&gt; &lt;span class="n"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;H2RDF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;gr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ntua&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h2rdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concurrent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SyncPrimitive&lt;/span&gt; &lt;span class="n"&gt;qTest&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;where masterDNS is the DNS name of your zookeeper master node.&lt;/p&gt;
&lt;p&gt;To import RDF data, upload your ntriples file to HDFS and run&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hadoop&lt;/span&gt; &lt;span class="n"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;H2RDF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;sampler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SamplerEx&lt;/span&gt; &lt;span class="n"&gt;input_path&lt;/span&gt; &lt;span class="n"&gt;HBaseTable&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For more information, see&lt;br /&gt;
&lt;a class="" href="http://code.google.com/p/h2rdf/" rel="nofollow"&gt;the public repository&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="knowledge-base-interface"&gt;Knowledge base Interface&lt;/h1&gt;
&lt;p&gt;Three logical layers are used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the client (crawler cockpit, API crawler, etc.)&lt;/li&gt;
&lt;li&gt;the middle layer (Zookeeper queue library and RPC layer on top of it, and a&lt;br /&gt;
  separate process that pops requests from the queue and calls the appropriate&lt;br /&gt;
  function)&lt;/li&gt;
&lt;li&gt;H2RDF&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This allows to leave the triples manipulations to the middle layer and let the&lt;br /&gt;
clients only deal with high level operations. Moreover, the communication with&lt;br /&gt;
the middle layer uses a protocol with implementations in Java and Python.&lt;/p&gt;
&lt;p&gt;The middle layer relies on Zookeeper queues (implemented on top of the ZK file&lt;br /&gt;
system) for communication with the clients: each client uses a pair of queues,&lt;br /&gt;
one to send requests, the other one to receive responses. On the other&lt;br /&gt;
side, an independent Java process code pops each request, decodes it, calls the&lt;br /&gt;
corresponding triple store queries, encodes the reply and enqueues it.&lt;/p&gt;
&lt;p&gt;JSON-RPC encoding could be used for the RPC parameters and responses.&lt;br /&gt;
Currently, a custom JSON format is implemented.&lt;/p&gt;
&lt;p&gt;See &lt;code&gt;rdfstore/README_API_call.txt&lt;/code&gt; for more details on how to implement new&lt;br /&gt;
RPCs.&lt;/p&gt;
&lt;p&gt;See the &lt;a class="" href="../TripleStoreConnector"&gt;the triple store connector&lt;/a&gt; for more&lt;br /&gt;
information on the RDF and JSON used for populating the triple store.&lt;/p&gt;
&lt;h2 id="getting-and-putting-data-to-the-h2rdf-triple-store"&gt;Getting and Putting Data to the H2RDF Triple Store&lt;/h2&gt;
&lt;p&gt;&lt;img alt="H2RDF's Architecture" src="../h2rdf.png" title="H2RDF's Architecture" /&gt;&lt;/p&gt;
&lt;p&gt;The figure above presents an overview of H2RDF\'s architecture. The system&lt;br /&gt;
imports RDF triples into 3 different HBase indices, using either the HBase&lt;br /&gt;
API or highly efficient, Map-Reduce, bulk import jobs.&lt;/p&gt;
&lt;p&gt;Users are able to execute multiple SPARQL queries over the imported data which are parsed by&lt;br /&gt;
Jena\'s SPARQL parser to ensure syntax correctness and create the query graph.&lt;br /&gt;
Our Join Planner iterates over the query graph and greedily chooses the join&lt;br /&gt;
that needs to be executed, considering the selectivity and cost of all possible&lt;br /&gt;
joins. Joins are executed by the Join Executor module that decides which&lt;br /&gt;
algorithm will be used for each join, out of a selection of Map-Reduce-based&lt;br /&gt;
and centralised join algorithms. While centralised joins are executed on a&lt;br /&gt;
single cluster node, distributed joins launch Map-Reduce jobs. After all joins&lt;br /&gt;
are executed, query results are stored in HDFS files and can be accessed by&lt;br /&gt;
iterators implemented in the client code.&lt;/p&gt;
&lt;p&gt;H2RDF is also designed to execute concurrent SPARQL queries and achieve&lt;br /&gt;
great query throughput by utilizing all cluster resources, especially in&lt;br /&gt;
the case of centralised joins.&lt;/p&gt;
&lt;p&gt;H2RDF utilises a \'zookeeper quorum\' (a replicated key-value store) in order&lt;br /&gt;
to offer a multi-language client API and schedule client requests to the&lt;br /&gt;
available server resources. Apache Zookeeper provides a good solution because, primarily,&lt;br /&gt;
it offers a way to handle synchronisation in distributed environments and also&lt;br /&gt;
because it offers&lt;br /&gt;
&lt;a class="" href="https://cwiki.apache.org/ZOOKEEPER/zkclientbindings" rel="nofollow"&gt;client bindings for several programming languages&lt;/a&gt;. We use&lt;br /&gt;
Apache Zookeeper to implement a distributed request queue. Clients post&lt;br /&gt;
requests to the queue while server instances constantly check the queue and&lt;br /&gt;
grab requests for execution. Requests are abstracted in order to provide a high&lt;br /&gt;
level API that can be easily extended to provide new functionality. Each&lt;br /&gt;
request object posted to the zookeeper queue contains a byte array of data&lt;br /&gt;
that consists of the request type as well as its input data, serialised in&lt;br /&gt;
JSON format. The implemented requests can be seen in the following table.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;executeQuery&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Database table name, query string&lt;/td&gt;
&lt;td&gt;Query results&lt;/td&gt;
&lt;td&gt;Execute a regular SPARQL query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getICS&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Campaign Id&lt;/td&gt;
&lt;td&gt;Serialised crawl specification&lt;/td&gt;
&lt;td&gt;Returns the last crawl specification for the specified campaign Id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;putICS&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Serialised crawl specification&lt;/td&gt;
&lt;td&gt;True/false&lt;/td&gt;
&lt;td&gt;Upload a new crawl specification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bulkPutTriples&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Database table name, NTriples file&lt;/td&gt;
&lt;td&gt;True/false&lt;/td&gt;
&lt;td&gt;Append the input triples to a HDFS file that will be used as
        input to the MapReduce bulk import job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bulkLoadTriples&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Database table name&lt;/td&gt;
&lt;td&gt;True/false&lt;/td&gt;
&lt;td&gt;Launch a bulk import MapReduce job to load the gathered triples to
        the database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The client code is implemented both in Java and Python in order to facilitate&lt;br /&gt;
the communication of the different ARCOMEM modules with the triple store.&lt;br /&gt;
Furthermore, the server side request handlers are reloaded before the&lt;br /&gt;
execution of each request offering the capability to add or remove API&lt;br /&gt;
functionality without having to restart the H2RDF cluster.&lt;/p&gt;
&lt;p&gt;The Java client code offers more functionality and ease for accessing the&lt;br /&gt;
database. The main class used to connect to H2RDF is &lt;code&gt;gr.ntua.h2rdf.client.Store&lt;/code&gt;.&lt;br /&gt;
The following code creates a store object that is connected to H2RDF.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;myserver.com&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;MyDatabase&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;UserName&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;H2RDFConf&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;H2RDFConf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;H2RDFFactory&lt;/span&gt; &lt;span class="n"&gt;h2fact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;H2RDFFactory&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h2fact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connectStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To connect to the database users need to provide three configuration parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Address: the dns name of the master node of the cluster.&lt;/li&gt;
&lt;li&gt;Table: the name of the database they want to connect with.&lt;/li&gt;
&lt;li&gt;User: a username that have the required HDFS read/write permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After connection the store object can be used to invoke all the implemented&lt;br /&gt;
API methods. The functions provided by the Store object are:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;add&lt;/td&gt;
&lt;td&gt;Triple(jena object that represents an RDF triple)&lt;/td&gt;
&lt;td&gt;void&lt;/td&gt;
&lt;td&gt;Add a RDF triple to the store. It uses the specified loader class.
        There are 3 types of loaders: 1) HBASE_SEQUENTIAL: adds the triples
        sequentially using the HBase API; 2) HBASE_BULK: does a client side
        buffering of the triples in order to use HBase bulk API operations; 3)
        BULK: gathers the triples to HDFS files and launches a MapReduce job to
        import them to HBase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;exec&lt;/td&gt;
&lt;td&gt;SPARQL query string&lt;/td&gt;
&lt;td&gt;ResultSet&lt;/td&gt;
&lt;td&gt;Executes the SPARQL query and returns a ResultSet object that can
        be used to iterate over the result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;execOpenRDF&lt;/td&gt;
&lt;td&gt;SPARQL query string&lt;/td&gt;
&lt;td&gt;QueryResult&amp;lt;BindingSet&amp;gt;&lt;/td&gt;
&lt;td&gt;Executes the SPARQL query and returns a QueryResult object that
        can be used to iterate over the result. This method is implemented
        in order to provide the same querying interface as openRDF and limit
        the effort of integrating modules designed to work using openRDF.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setLoader&lt;/td&gt;
&lt;td&gt;String(type of loader)&lt;/td&gt;
&lt;td&gt;void&lt;/td&gt;
&lt;td&gt;Set the loader used from the store object. (HBASE_SEQUENTIAL,
        HBASE_BULK, BULK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;putICS&lt;/td&gt;
&lt;td&gt;Crawl specification object&lt;/td&gt;
&lt;td&gt;void&lt;/td&gt;
&lt;td&gt;Uploads a new crawl specification.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getICS&lt;/td&gt;
&lt;td&gt;URI of the campaign Id&lt;/td&gt;
&lt;td&gt;Crawl specification object&lt;/td&gt;
&lt;td&gt;Returns the last crawl specification for the specified campaign Id&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="python-interface"&gt;Python interface&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;rdfstore&lt;/code&gt; also has a python binding to most high level operations under&lt;br /&gt;
&lt;code&gt;src/main/python&lt;/code&gt;. The library modules come with an example of how to create an&lt;br /&gt;
ICS (&lt;code&gt;ics_example.py&lt;/code&gt;) or call statistics functions (&lt;code&gt;api_examples.py&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For instance, to create an ICS, edit the ICS in &lt;code&gt;ics_example.py&lt;/code&gt;, update the&lt;br /&gt;
Zookeeper server and port if needed, and run it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="n"&gt;vi&lt;/span&gt; &lt;span class="n"&gt;ics_example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;ics_example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will write the ICS to the triple store, retrieve it from the triple store&lt;br /&gt;
and print the answer.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">John Arcoman</dc:creator><pubDate>Wed, 19 Feb 2014 00:30:44 -0000</pubDate><guid>https://sourceforge.net0e2e7b767ee52e130bfeda628b34d24f4b0898b7</guid></item></channel></rss>