Haylyn - Viewing the Semantic Web Through the Oculus Rift

A couple of days ago, my developer version of the Oculus Rift Virtual Reality (VR) headset arrived.  It came in a very slick plastic case and hooked up to my computer in minutes.  I installed the software and ran the demonstration "world" and stuck my head into the Oculus Rift - Amazing!  The quality and immersive sense was better than I thought it would be.  A couple of years ago, I had ordered another virtual reality (VR) headset from a different company and, well, after five minutes of playing with that one, I shipped it back.  It was like looking at the screen down a five foot tunnel.  It had head tracking and it was neat for a few minutes, but I was never going to use it in any practical sense.  So, I shipped it back.

The Oculus Rift does not suffer from this tunnel effect!  Definately a keeper.  I wanted to interface the Oculus Rift with my Haylyn Project (formerly known as Nexus.  I'll go into the reasons for the name change some other time).  In the past couple of months, I had re-written the Haylyn WebGL/HTML5 client and changed the WebGL libraries from GLGE to Three.js.  GLGE was excellent to work with, but the project has been inactive for too long for my comfort and Three.js has a fairly active user and developer base.  The question now is how to access the Oculus Rift from within the browser?  After a little bit of searching, I downloaded and installed the vr.js code by Ben Vanik which includes a NPAPI plugin that works with Chrome and Firefox.  Ben Vanik provides several demos for using the vr.js with the Oculus Rift including a Three.js version.  The image in this article shows the dual screen effect seen without the Oculus Rift Headset on.  The image depicts the aggregated http traffic to my VIVO site http://reach.suny.edu as linked data that I did as a poster at the 4th VIVO National Conference last week.  See poster here.

With the Oculus Rift Headset, graphs and other visuals can be seen in 3D and with the added bonus of head-tracking, you can immerse yourself in a world of data and look up, down, left, right, diagonally, etc just by moving and turning your head.  Haylyn WASD functionality allows you to move around the scene of RDF linked data.  The "endless plane" and cubes in the image are objects that I added from the vr.js demo.  They looked good but have nothing to do with the colored RDF graph.  The vr.js libraries also work with Sixense's Razer Hydra which is a motion capture system for your hands.  Sixense is also working on a wireless version of the Hydra called the STEM System.  I can't imagine the mouse and keyboard being the pinnacle of computer/human interface technology.  Hey, W3C Device APIs Group, can we add the Rift?! The thought of being able to reach into the 3D scene and grab and manipulate triples and data with my hands...Some distractions are too cool to ignore...must...order.....Squirrel!




Myself and my colleague Tammy DiPrima have implemented WebID authentication and provisioning for VIVO (http://www.vivoweb.org).  WebID is a way to uniquely identify people and agents with a URI and provide a central identity and authentication system based on digital certificates.  WebID is being developed by the W3C WebID Community group. VIVO is a faculty/researcher profile system developed by Cornell, University of Florida, Indiana University, Washington University in St. Louis, Weill Cornell Medical College, Ponce School of Medicine, Puerto Rico, and The Scripps Research Institute.  There are instances of VIVO world-wide and a map of which can be seen at http://www.vivoweb.org/international-researcher-network.  What makes VIVO special is that it is driven and built-on Semantic Web technology and keeps everything in RDF triple store.  VIVO generates web pages for each researcher from linked data.  An example of this can be seen at http://vivo.ufl.edu/display/n25562 which is the page for Michael Conlon, the Principal Investigator for VIVO.  A RDF Turtle representation can be seen at http://vivo.ufl.edu/individual/n25562/n25562.ttl.  RDF/XML is also available.  WebID and VIVO make for great dance partners.  VIVO already provides much of what is needed to implement WebID authentication and provisioning.  We have done this in the form of several java servlets which install along side and within the VIVO core application.  The WebID authentication code was borrowed from my Haylyn project (formerly Nexus) which I had developed last year. The source code for WebID4VIVO can been found at https://github.com/ebremer/webid4vivo.

The poster for WebID4VIVO that will be presented at the VIVO national conference this week is attached to this article.  Further testing of WebID4VIVO is being done but has been tested with https://my-profile.eu/ and of course, with itself ;-)  WebID4VIVO allows existing WebIDs to be associated with their VIVO profile.

Learn more about WebID at http://www.w3.org/wiki/WebID.



Apache RDF PipeLogger Agent Beta 1 Released

I have released the beta 1 version of my RDF PipeLogger on GitHub https://github.com/ebremer/PipeLogger under the BSD 3-Clause License.  The program is still being tested but appears to be stable enough for a beta release.  The project was developed in NetBean 7.3 using JDK 1.7.0_17.

My test server currently uses the following LogFormat config with potential simplifications indicated with individual line comments:

LogFormat "[\
a http:Request;\
:referrer \"%{Referer}i\";\
:useragent \"%{User-agent}i\";\
:remotehost \"%h\";\              #will be listed as an ip if resolve hosts is not configured on Apache
:remotehostip \"%a\";\
:remoteuser \"%u\";\               # typically blank if http authentication is not require.  If authentication is never required, leave this line out.
time:inXSDDateTime \"%{%Y-%m-%dT%T%z}t\";\
:canonicalservername \"%v\";\   #this would be the "true name" of the server/virtual host.
:querystring \"%q\";\
:numKArequests %k;\
http:httpVersion \"%H\";\
http:methodName \"%m\";\
:port %p;\          # here for completeness, but can be removed since will are usually only listening on port 80 or port 443
:requestsize %I;\
http:absoluteURI <http://%{Host}i%U>;\   # this triple would be the minimum, the next two can be derived from this one
http:absolutePath \"%U\";\
http:authority <http://%{Host}i>\
] http:resp [\
http:statusCodeValue %>s;\
:requesttime %D;\
:responsesizenh %B;\
:responsesize %O;\
:connectionstatus \"%X\"\
] ." log2rdf

The CustomLog command on the test server is:

CustomLog "|/usr/java/default/bin/java -jar /mnt/exodus/disk1/log/PipeLogger.jar /mnt/exodus/disk1/log/config.ttl > /mnt/exodus/disk1/log/errors" log2rdf

The configuration file for PipeLogger is specified as a turtle-formatted file given as the first parameter to PipeLogger.  Any output of PipeLogger is redirected to a file.  The upload URI for Virtuoso is in the form: http://serverdnsname:8890/sparql-graph-crud with a authentication based version at http://serverdnsname:8890/sparql-graph-crud-auth.  See (http://docs.openlinksw.com/virtuoso/rdfsparql.html#rdfsparqlprotocolendpoint)

General Operation of PipeLogger
Turtle-formatted data is piped from Apache to PipeLogger with out prefixes.  Prefixes could be specified in the httpd.conf file but by prepending them in PipeLogger saves a bit on bandwidth.  PipeLogger adds the RDF prefixes and then accumulates triples until the buffer size is reached and then attempts to flush the data to the quad store.  If the quad store is unavailable, the triples are accumulated further until an absolute maximum is reached.  If, at this point,  the quad store does nto respond, the data is written to a file.  Later, when the quad store responds, data is loaded back into memory and then flushed to the triple store.  A timer attempts to flush the memory buffer ay configured intervals in case the site traffic is low.

Converting http logs to RDF and aggregating them to a central quad store enables one to use the powerful SPARQL query language to analyze your logs.  But why not just use the popular Google Analytics?  Google Analytics is excellent for well-behaved traffic, but because of how it works, it's not so good with the misbehaved or hostile traffic.  How so?  Google Analytics works by adding a small snippet of javascript to every web page in a web site that has been tagged with a unique identifier for that site.  When the web page containing the javascript is downloaded by a client it is executed and data is sent back to the Google Analytics servers.  Now in the case of a hostile client, one that is probing the web site for weaknesses, is not required to execute this javascript code, nor will it get any javascript if the page doesn't exist.  For example, a hacker is attempting to determine if a site contains a typical Word Press-specific special function page.  If the page does not exist, the site is not Word Press.  Google Analytics will never see this attempt.  This information can only be obtained by looking at the actual logs for that web page.  In a nutshell, for security information, we would like to see all log data that the http response code is not 200.

Future Work
This analysis would be made more robust with the following:

1) RDF geo-located IP address data
2) RDF IP net block ownership data

These two datasets would enable one to figure out from where in the world connections are coming from and who a particular IP belongs to, or at least, the ISP responsible for an IP.

Additional data can be collected the the logger program in addition to the Apache log information collect.  Information like CPU utilization, memory, disk IO, etc could also be collected as RDF and forwarded to the central quad store.  With this data, a more complete picture of what is happening to a web server can be constructed.

Happy RDF logging! :-)


Configuring the Apache HTTP Server to generate logs in RDF Turtle

Each time I get a complaint that one of my web servers is running slow, the first thing I do is look at the Apache httpd logs.  For anyone familiar with Apache HTTP Server logs, they are not particularly useful when trying to analyze huge amounts logging information.  Trying to figure out what client(s) may or may not be misbehaving usually requires some log analysis tool whether commercial or open-source.  As it is, the http server logs alone do not tell a complete story of what is going on.  Additional data is necessary from other network systems to piece together a more complete picture of what is going on in order to make a meaningful analysis.  These other systems provide data in various logging formats.  Expensive log aggregation software can be purchased to solve this problem, but, why not try to fix the real problem? - all of our logs are in different formats.  Let us homogenized them with linked data!

Here, I attempt to go after some low-hanging fruit by focusing on the Apache HTTP Server logs by configuring Apache to generate it's logs in RDF Turtle and start the process of homogenizing and linking my system and network data to get the bigger picture.

Custom Log Formats in Apache httpd

Apache httpd has the ability to generate logs in multiple custom formats using the "LogFormat" command.  It is with this command that we can get the Apache HTTP Server to serve it's logs in RDF Turtle. I make use of the following ontologies/vocabularies in doing so:

HTTP Vocabulary in RDF 1.0 (rdfs)
Time Ontology in OWL (rdf/xml)

prefix http: <http://www.w3.org/2011/http>
prefix time: <http://www.w3.org/2006/time>

The third ontology is custom-made to describe the Apache-specific data elements:
prefix : <http://www.ebremer.com/apache>  (default prefix in config file to keep things compact)

Rather than worrying about creating URIs for each log event, blank nodes are used instead.  The following modifications are needed to the /etc/httpd/conf/httpd.conf file:

LogFormat "[\
a http:Request;\
:referrer \"%{Referer}i\";\
:useragent \"%{User-agent}i\";\
:remotehost \"%h\";\
:remotehostip \"%a\";\
:remoteuser \"%u\";\
time:inXSDDateTime \"%{%Y-%m-%dT%T%z}t\";\
:canonicalservername \"%v\";\
:querystring \"%q\";\
:numKArequests %k;\
http:httpVersion \"%H\";\
http:methodName \"%m\";\
:port %p;\
:requestsize %I;\
http:absoluteURI <http://%{Host}i%U>;\
http:absolutePath \"%U\";\
http:authority <http://%{Host}i:%p>\
] http:resp [\
http:statusCodeValue %>s;\
:requesttime %D;\
:responsesizenh %B;\
:responsesize %O;\
:connectionstatus \"%X\"\
] ." logRDF
CustomLog "/var/log/rdflog" logRDF

With these changes made, simply restart the httpd server and your server will now generate it's logs in RDF Turtle!  Some of these elements may not be so interesting like "port" if port 80 is the only one being listened on.  The lines can be removed to reduce the number of triples per log event.  The RDF generated can be loaded into any triple store where you can perform multiple SPARQL queries to analyze the logging information.  You can even combine it with other data to paint an even bigger picture.  A geolocation dataset for IPs would enabled analysis to locate requests to their originating countries and cities.  I am currently in the process of doing this now and this data set will be posted.  But wait, there's more!  Why bother saving the data to disk when we can send it directly to the triple store?

Enter the SPARQL 1.1 Graph Store HTTP Protocol
Part of the new SPARQL 1.1 recommendations is the SPARQL 1.1 Graph Store HTTP Protocol.  We can take advantage of this with a new program that I wrote that will take the output of Apache and send it to the triple store, in my case, Virtuoso, an open-source RDF quad store which supports this new graph store protocol.  Mine runs on a Amazon Cloud EC2 instance.  Since the data flow is into Amazon's cloud, network transfer costs are minimal.  Local servers can be used. OpenLink Software's Virtuoso also has a commercially supported version.  Other triple/quad stores can be used if they support the Graph Store Protocol.  Logging output from Apache is redirected to the new program using Apache HTTP Server's "piped logging".  This is enabled by modifying the CustomLog line (or adding a new line - you can have multiple log channels) in the following way:

CustomLog "|java -cp /opt/PipeLogger/PipeLogger PipeLogger > /opt/PipeLogger/PipeLogger.log" logRDF

The new program, named PipeLogger, is written in java and utilitizes Apache Jena and Jetty.  PipeLogger reads the piped data and then loads it into a Jena Model.  PipeLogger is responsible for adding the RDF prefixes to the data sent to the RDF triplestore.  Configuration parameters let PipeLogger know how many triples to load into memory before flushing it to Virtuoso.  In case the triplestore is unavailable, for whatever reason, PipeLogger will buffer the data in memory and then eventually, save the RDF to disk until the triplestore becomes available again.  Multiple web sites, whether hosted on the same server and/or multiple servers in different locations, can all send their Apache HTTP Server log data back to a central triple store as RDF.  Different web sites and servers can send to different named graphs.  PipeLogger will be freely available as open-source after initial testing is complete.

Analyzing the logging data with SPARQL

Looking at various Apache HTTP Server log analysis programs listed here, I have begun to construct various SPARQL queries to emulate the same types of reports.

Query #1 - This SPARQL query will list pages and rank them by the number of visitors but with the addition of the error response codes.  In this case, I'm curious to what people are looking for and what they are not finding when the response code is not 200 in addition to the successful connections.

prefix httpd: <http://www.ebremer.com/httpd/>
prefix http: <http://www.w3.org/2011/http#>
prefix time: <http://www.w3.org/2006/time/>
select ?uri ?statusCodeValue count(distinct ?ip) as ?visitors
          where {?s http:absolutePath ?uri .
                 ?s httpd:remotehostip ?ip .
                 ?s http:resp ?r .
                 ?r http:statusCodeValue ?statusCodeValue .
                 filter (!regex(?uri, "^.*\\.(jpg|png|gif|js|css|ico|txt)$", "i"))
order by ?statusCodeValue desc(?visitors)

Query #2 - This SPARQL query lists the referrers ranked by the number of visitors.  Self-referencing referrers are removed with the filter command.

prefix httpd: <http://www.ebremer.com/httpd/>
prefix http: <http://www.w3.org/2011/http#>
prefix time: <http://www.w3.org/2006/time/>
select ?referrer count(distinct ?ip) as ?visitors
          where {?s httpd:referrer ?referrer .
                 ?s httpd:remotehostip ?ip .
order by desc(?visitors)

Results for both sample query #1 and #2 are at the end of this post.  The queries were executed against a week's worth of logs for my website and totalled 601,795 triples.  At some point, it will be interesting to visualize this RDF data graphically.  Yes you guessed it, I will be using my 3D RDF visualizating system for this.  Stay tuned for the PipeLogger open source and testing post and further development on RDF logging.

Query #1 Results

uri statusCodeValue visitors
/index.php 200 509
/encore 200 105
/nexus/2011-05-15 200 70
/encore/originalproject 200 57
/nexus/WebGL-3D-RDF-client-in-Technicolor 200 54
/projects 200 52
/semantic_web 200 51
/cv 200 51
/nexus 200 47
/contact 200 45
/about 200 44
/nexus/WebIDauthentication 200 44
/tags/nexus 200 44
/nexus/screenshots 200 44
/doublebufferslidescriptforsl 200 43
/tags/entertainment 200 42
/nexus/html5triplebytriple 200 41
/monolith 200 41
/foaf.rdf 200 40
/nexus/RDF-Triples-over-HTML5-Websockets 200 39
/monolith/about 200 36
/monolith/screenshots 200 33
/monolith/manual 200 33
/taxonomy/term/7 200 32
/taxonomy/term/3 200 31
/nexus/2012-06-10/rfc6455 200 31
/rss.xml 200 30
/nexus/3DRDFFOAFinWebGLlinkedtoOpenSim 200 30
/taxonomy/term/4 200 30
/nexus/2010-10-09 200 29
/tags/websockets 200 29
/tags/monolith 200 28
/nexus/communicationstestvideo 200 28
/taxonomy/term/2 200 27
/users/ebremer 200 26
/tags/html5 200 24
/tags/drupal 200 24
/nexus/2010-08-19 200 24
/tags/webgl 200 23
/tags/video-streaming 200 23
/tags/webid 200 22
/entertainment/modernman 200 21
/content/ebremer-now-running-drupal-70 200 21
/nexus/2011-02-19/Nexus-OpenSimulator-Region-Module 200 21
/monolith/the-magic-behind-monolith-how-it-works 200 21
/nexus/blog/2010-08-22 200 19
/taxonomy/term/6 200 19
/tags/jetty 200 18
/tags/virtual-worlds 200 18
/entertainment/whitacresvirtualchoir 200 17
/taxonomy/term/8 200 17
/tags/pubmed 200 17
/medievalhelpdesk 200 16
/tags/computers 200 16
/monolith/2010-10-08 200 16
/blog/worldbuilder 200 16
/tags/comedy 200 15
/system/files/story/files/cshals2011-poster.pdf 200 15
/tags/umls 200 14
/system/files/story/files/gordon-conference-2011-poster.pdf 200 14
/tags/general 200 14
/tags/open-data 200 14
/taxonomy/term/16/all/feed 200 14
/content/tim-berners-lee-year-open-data-went-worldwide 200 13
/monolith/2011-03-20 200 12
/tags/humor 200 11
/tags/tools 200 11
/taxonomy/term/41/all/feed 200 11
/user 200 11
/tags/vivo 200 11
/taxonomy/term/2/all/feed 200 10
/content/introduction-semantic-web 200 10
/taxonomy/term/7/all/feed 200 10
/taxonomy/term/29/all/feed 200 10
/taxonomy/term/3/all/feed 200 9
/taxonomy/term/4/all/feed 200 9
/taxonomy/term/18/all/feed 200 8
/sitemap.xml 200 8
/taxonomy/term/5/all/feed 200 8
/content/tim-berners-lee-next-web-open-linked-data 200 8
/taxonomy/term/31/all/feed 200 8
/taxonomy/term/34/all/feed 200 7
/taxonomy/term/15/all/feed 200 7
/taxonomy/term/6/all/feed 200 5
/taxonomy/term/19/all/feed 200 5
/taxonomy/term/11/all/feed 200 5
/filter/tips 200 5
/user/login 200 5
/taxonomy/term/5/all 200 5
/taxonomy/term/7/all 200 5
/taxonomy/term/9/all/feed 200 5
/taxonomy/term/17/all/feed 200 5
/taxonomy/term/32/all/feed 200 5
/nexus/commands 200 4
/taxonomy/term/13/all/feed 200 4
/taxonomy/term/29/all 200 4
/taxonomy/term/16/all 200 4
/user/password 200 4
/taxonomy/term/41/all 200 3
/taxonomy/term/8/all/feed 200 3
/taxonomy/term/12/all/feed 200 3
/taxonomy/term/14/all/feed 200 3
/sparql 200 3
/node/15/rdf 200 3
/node/24/rdf 200 3
/taxonomy/term/2/all 200 3
/taxonomy/term/8/all 200 3
/taxonomy/term/30/all/feed 200 3
/node/1/rdf 200 3
/taxonomy/term/34/all/encore/originalproject 200 2
/node/60/rdf 200 2
/taxonomy/term/27/all/feed 200 2
/taxonomy/term/28/all/feed 200 2
/taxonomy/term/28/all 200 2
/node/17/rdf 200 2
/node/7/rdf 200 2
/tags/education 200 2
/tags/software 200 2
/taxonomy/term/17/all 200 2
/taxonomy/term/26/all 200 2
/taxonomy/term/27/all 200 2
/taxonomy/term/4/all 200 2
/taxonomy/term/9/all 200 2
/tags/web 200 2
/taxonomy/term/14/all 200 2
/taxonomy/term/11/all 200 2
/content/3d-graph-subset-suny-researcher-interests-focus-disease 200 2
/admin/content 200 2
/node/81/edit 200 2
/taxonomy/term/10/all 200 2
/taxonomy/term/15/all/encore/originalproject 200 2
/taxonomy/term/10/all/feed 200 2
/taxonomy/term/19/all 200 2
/node/23/rdf 200 2
/taxonomy/term/15/all 200 2
/person2/Goodman/Steven 200 2
/taxonomy/term/31/all 200 2
/admin/config 200 2
/admin/modules 200 2
/admin/config/user-interface/themekey 200 2
/admin/config/user-interface/themekey/settings 200 2
/admin/config/user-interface/themekey/settings/debug 200 2
/overlay-ajax/page_top 200 2
/taxonomy/term/30/all 200 2
/image_captcha/14483/1360636422 200 1
/taxonomy/term/26/all/feed 200 1
/image_captcha/15114/1363863975 200 1
/image_captcha/15114/1363863976 200 1
/image_captcha/15114/1363863977 200 1
/image_captcha/15114/1363863979 200 1
/image_captcha/15114/1363863980 200 1
/image_captcha/15114/1363863982 200 1
/image_captcha/15114/1363863983 200 1
/image_captcha/15114/1363863984 200 1
/image_captcha/15114/1363863986 200 1
/image_captcha/15114/1363863987 200 1
/image_captcha/15114/1363863988 200 1
/image_captcha/15114/1363863990 200 1
/image_captcha/15114/1363863991 200 1
/image_captcha/15114/1363863992 200 1
/image_captcha/15114/1363863994 200 1
/image_captcha/15114/1363863995 200 1
/image_captcha/15114/1363863997 200 1
/image_captcha/15114/1363863998 200 1
/image_captcha/15114/1363863999 200 1
/image_captcha/15114/1363864001 200 1
/image_captcha/15114/1363864002 200 1
/image_captcha/15114/1363864004 200 1
/image_captcha/15114/1363864005 200 1
/image_captcha/15114/1363864007 200 1
/taxonomy/term/34/all 200 1
/node/12/rdf 200 1
/node/14/rdf 200 1
/node/18/rdf 200 1
/node/54/rdf 200 1
/node/8/rdf 200 1
/tags/astronomy 200 1
/taxonomy/term/25/all/feed 200 1
/taxonomy/term/3/all 200 1
/taxonomy/term/6/all 200 1
/taxonomy/term/32/all 200 1
/image_captcha/15119/1364023583 200 1
/taxonomy/term/34/all/encore/encore/encore/encore/originalproject 200 1
/image_captcha/15050/1361594380 200 1
/image_captcha/12871/1354036363 200 1
/image_captcha/15117/1363942064 200 1
/image_captcha/15120/1364098781 200 1
/admin/reports/updates/update 200 1
/image_captcha/15121/1364133990 200 1
/node/24/encore/originalproject 200 1
/taxonomy/term/13/all 200 1
/taxonomy/term/23/all/feed 200 1
/taxonomy/term/24/all/feed 200 1
/taxonomy/term/25/all 200 1
/taxonomy/term/20/all/feed 200 1
/image_captcha/15122/1364214800 200 1
/image_captcha/15122/1364214801 200 1
/image_captcha/15122/1364214803 200 1
/image_captcha/15122/1364214804 200 1
/image_captcha/15122/1364214805 200 1
/image_captcha/15122/1364214806 200 1
/image_captcha/15122/1364214807 200 1
/image_captcha/15122/1364214809 200 1
/image_captcha/15122/1364214810 200 1
/image_captcha/15122/1364214811 200 1
/image_captcha/15122/1364214812 200 1
/image_captcha/15122/1364214814 200 1
/image_captcha/15122/1364214815 200 1
/image_captcha/15122/1364214816 200 1
/image_captcha/15122/1364214817 200 1
/image_captcha/15122/1364214819 200 1
/image_captcha/15122/1364214820 200 1
/image_captcha/15122/1364214821 200 1
/image_captcha/15122/1364214822 200 1
/image_captcha/15122/1364214823 200 1
/image_captcha/15122/1364214825 200 1
/image_captcha/15122/1364214826 200 1
/image_captcha/15122/1364214827 200 1
/image_captcha/15122/1364214828 200 1
/image_captcha/15122/1364214830 200 1
/image_captcha/15122/1364214831 200 1
/image_captcha/15122/1364214832 200 1
/image_captcha/15122/1364214833 200 1
/image_captcha/15122/1364214835 200 1
/image_captcha/15122/1364214836 200 1
/image_captcha/15122/1364214837 200 1
/image_captcha/15122/1364214838 200 1
/image_captcha/15118/1364006438 200 1
/image_captcha/15123/1364253735 200 1
/image_captcha/15123/1364253737 200 1
/image_captcha/15123/1364253738 200 1
/image_captcha/15123/1364253739 200 1
/image_captcha/15123/1364253743 200 1
/image_captcha/15123/1364253745 200 1
/image_captcha/15123/1364253746 200 1
/image_captcha/15123/1364253747 200 1
/image_captcha/15123/1364253748 200 1
/image_captcha/15123/1364253750 200 1
/image_captcha/15123/1364253751 200 1
/image_captcha/15123/1364253752 200 1
/image_captcha/15123/1364253753 200 1
/image_captcha/15123/1364253755 200 1
/image_captcha/15123/1364253756 200 1
/image_captcha/15123/1364253757 200 1
/image_captcha/15123/1364253758 200 1
/image_captcha/15123/1364253759 200 1
/image_captcha/15123/1364253761 200 1
/image_captcha/15123/1364253762 200 1
/image_captcha/15123/1364253763 200 1
/image_captcha/15123/1364253764 200 1
/image_captcha/15123/1364253766 200 1
/image_captcha/15123/1364253767 200 1
/image_captcha/15123/1364253768 200 1
/node/24/encore/encore/originalproject 200 1
/taxonomy/term/23/all 200 1
/taxonomy/term/24/all 200 1
/taxonomy/term/12/all 200 1
/taxonomy/term/20/all 200 1
/image_captcha/15124/1364309906 200 1
/image_captcha/15124/1364309907 200 1
/image_captcha/15124/1364309908 200 1
/image_captcha/15124/1364309910 200 1
/image_captcha/15124/1364309911 200 1
/image_captcha/15124/1364309913 200 1
/image_captcha/15124/1364309914 200 1
/image_captcha/15124/1364309915 200 1
/image_captcha/15124/1364309917 200 1
/image_captcha/15124/1364309918 200 1
/image_captcha/15126/1364325968 200 1
/configuring-apache-httpd-generate-logs-in-rdf 200 1
/sites/all/libraries/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm 200 1
/taxonomy/term/18/all 200 1
/paladin/2013-03-26/configuring-apache-httpd-generate-logs-in-rdf-turtle 200 1
/image_captcha/15127/1364361632 200 1
/image_captcha/15127/1364361634 200 1
/image_captcha/15127/1364361635 200 1
/image_captcha/15127/1364361637 200 1
/image_captcha/15127/1364361638 200 1
/image_captcha/15127/1364361640 200 1
/image_captcha/15127/1364361641 200 1
/image_captcha/15127/1364361642 200 1
/image_captcha/15127/1364361644 200 1
/image_captcha/15129/1364403904 200 1
/image_captcha/15129/1364403908 200 1
/image_captcha/15130/1364404087 200 1
/image_captcha/15130/1364404097 200 1
/image_captcha/15130/1364404103 200 1
/image_captcha/15130/1364404105 200 1
/image_captcha/15132/1364414325 200 1
/node/58/rdf 200 1
/node/24/encore/encore/encore/originalproject 200 1
/node/17/edit 200 1
/node/20/rdf 200 1
/image_captcha/15054/1361747061 200 1
/image_captcha/15059/1361852716 200 1
/admin/httprl-test 200 1
/admin/reports/status 200 1
/admin/config/system/browscap 200 1
/admin/config/user-interface/themekey/settings/ui 200 1
/user/1/shortcuts 200 1
/user/1/edit 200 1
/admin/people 200 1
/admin/modules/uninstall 200 1
/admin/modules/uninstall/confirm 200 1
/node/24/encore/encore/encore/encore/originalproject 200 1
/taxonomy/term/15/encore/originalproject 200 1
/taxonomy/term/15/all/encore/encore/originalproject 200 1
/image_captcha/15136/1364830707 200 1
/image_captcha/15136/1364830709 200 1
/image_captcha/15136/1364830710 200 1
/image_captcha/15136/1364830711 200 1
/image_captcha/15136/1364830713 200 1
/image_captcha/15136/1364830714 200 1
/image_captcha/15136/1364830716 200 1
/image_captcha/15136/1364830717 200 1
/image_captcha/15136/1364830718 200 1
/image_captcha/15136/1364830720 200 1
/image_captcha/15136/1364830721 200 1
/image_captcha/15136/1364830722 200 1
/image_captcha/15136/1364830724 200 1
/image_captcha/15136/1364830725 200 1
/image_captcha/15138/1364836351 200 1
/image_captcha/15138/1364836369 200 1
/admin/config/user-interface/themekey/properties/delete/7 200 1
/admin/config/user-interface/themekey/properties 200 1
/image_captcha/15139/1364851507 200 1
/image_captcha/15139/1364851509 200 1
/image_captcha/15139/1364851510 200 1
/image_captcha/15139/1364851511 200 1
/image_captcha/15139/1364851513 200 1
/image_captcha/15139/1364851514 200 1
/image_captcha/15139/1364851516 200 1
/image_captcha/15139/1364851517 200 1
/image_captcha/15139/1364851519 200 1
/image_captcha/15139/1364851527 200 1
/image_captcha/15139/1364851528 200 1
/image_captcha/15139/1364851529 200 1
/image_captcha/15139/1364851531 200 1
/image_captcha/15139/1364851533 200 1
/node/6/rdf 200 1
/node/59/rdf 200 1
/node/16/rdf 200 1
/node/5/rdf 200 1
/node/21/rdf 200 1
/image_captcha/15142/1364922857 200 1
/image_captcha/15142/1364922859 200 1
/image_captcha/15142/1364922860 200 1
/image_captcha/15142/1364922861 200 1
/image_captcha/15142/1364922862 200 1
/image_captcha/15142/1364922864 200 1
/image_captcha/15142/1364922865 200 1
/image_captcha/15142/1364922866 200 1
/image_captcha/15142/1364922868 200 1
/image_captcha/15142/1364922869 200 1
/image_captcha/15142/1364922870 200 1
/image_captcha/15142/1364922871 200 1
/image_captcha/15142/1364922872 200 1
/image_captcha/15142/1364922874 200 1
/image_captcha/15142/1364922875 200 1
/image_captcha/15142/1364922876 200 1
/image_captcha/15144/1364929933 200 1
/image_captcha/15144/1364929934 200 1
/image_captcha/15144/1364929935 200 1
/image_captcha/15144/1364929937 200 1
/image_captcha/15144/1364929938 200 1
/image_captcha/15144/1364929939 200 1
/image_captcha/15144/1364929940 200 1
/image_captcha/15144/1364929942 200 1
/image_captcha/15144/1364929943 200 1
/image_captcha/15144/1364929944 200 1
/image_captcha/15144/1364929946 200 1
/image_captcha/15144/1364929947 200 1
/image_captcha/15144/1364929948 200 1
/user/1/weblinks 200 1
/image_captcha/15146/1364936787 200 1
/image_captcha/15146/1364936788 200 1
/image_captcha/15146/1364936790 200 1
/image_captcha/15146/1364936791 200 1
/image_captcha/15146/1364936792 200 1
/image_captcha/15146/1364936794 200 1
/image_captcha/15146/1364936796 200 1
/image_captcha/15146/1364936797 200 1
/image_captcha/15146/1364936799 200 1
/image_captcha/15146/1364936800 200 1
/image_captcha/15146/1364936801 200 1
/image_captcha/15146/1364936803 200 1
/image_captcha/15146/1364936804 200 1
/image_captcha/15146/1364936805 200 1
/image_captcha/15146/1364936807 200 1
/image_captcha/15146/1364936808 200 1
/image_captcha/15146/1364936810 200 1
/image_captcha/15146/1364936811 200 1
/image_captcha/15146/1364936812 200 1
/image_captcha/15146/1364936814 200 1
/image_captcha/15146/1364936815 200 1
/image_captcha/15146/1364936816 200 1
/image_captcha/15146/1364936818 200 1
/image_captcha/15146/1364936819 200 1
/image_captcha/15146/1364936820 200 1
/image_captcha/15141/1364854486 200 1
/node/24/encore/encore/encore/encore/encore/originalproject 200 1
/user/ebremer/rdf 200 1
/taxonomy/term/15/encore/encore/originalproject 200 1
/node/24/encore/encore/encore/encore/encore/encore/originalproject 200 1
/image_captcha/15159/1365360200 200 1
/image_captcha/15159/1365360201 200 1
/index.php 301 50
/encore/ 301 20
/taxonomy/term/5 301 10
/signup/ 301 6
/node/80 301 5
/index.php/forums/member/register 301 5
/register/ 301 5
/node/8 301 5
/node/18 301 4
/YaBB.cgi/ 301 4
/YaBB.pl/ 301 4
/node/24 301 3
/member/ 301 3
/node/56 301 3
/node/27 301 3
/nexus/html5triplebytriple/ 301 2
/node/25 301 2
/nexus/blog/ 301 2
/wp-admin/ 301 2
/node/78 301 2
/node/17 301 2
/node/9 301 2
/nexus/WebGL-3D-RDF-client-in-Technicolor/ 301 1
/system/files/story/files/ 301 1
/node/6 301 1
/node/74 301 1
/nexus/2011-05-15/ 301 1
/nexus/2011-02-19/ 301 1
/blog/ 301 1
/node/16 301 1
/wordpress/wp-admin/ 301 1
/wp/wp-admin/ 301 1
/old/wp-admin/ 301 1
/blogs/wp-admin/ 301 1
/node/5 301 1
/node/77 301 1
/node/63 301 1
/node/23 301 1
/blog/1/feed/ 301 1
/frontpage 301 1
/node/20 301 1
/node/60 301 1
/nexus/2012-06-10/ 301 1
/node/11 301 1
/node/7 301 1
/node/12 301 1
/cv/ 301 1
/nexus/ 301 1
/nexus/YaBB.cgi/ 301 1
/nexus/YaBB.pl/ 301 1
/nexus/register/ 301 1
/user 302 2
/admin/modules/list/confirm 302 2
/admin/config/user-interface/themekey 302 2
/admin/config/user-interface/themekey/settings/debug 302 2
/node/81/edit 302 1
/admin/reports/status/run-cron 302 1
/admin/compact/on 302 1
/admin/config/system/browscap 302 1
/admin/config/user-interface/themekey/settings/ui 302 1
/admin/config/user-interface/themekey/settings 302 1
/admin/modules/uninstall/confirm 302 1
/admin/config/user-interface/themekey/properties/delete/7 302 1
/admin/config/user-interface/themekey/properties 302 1
/rss.xml 304 4
/encore 304 4
/index.php 304 2
/foaf.rdf 304 2
/tags/pubmed 304 1
/taxonomy/term/2 304 1
/tags/entertainment 304 1
/nexus/html5triplebytriple 304 1
/taxonomy/term/3 304 1
/nexus 304 1
/user/register 403 121
/nexus/roadmap 403 9
/User/Register.aspx 403 4
/system/files/styles/300x300/private/page/images/3dlogo.jpg?itok=9TzSIHXX 403 2
/cron.php 403 1
/system/files/styles/600x600/private/page/images/Monolith%20Collaboration.jpg?itok=ZKHJzO5G 403 1
/admin/FCKeditor/editor/filemanager/upload/test.html 403 1
/node/add 403 1
/feed-item/250 404 17
/wp-login.php 404 7
/signup 404 6
/aggregator/categories/2 404 5
/tags/encore/originalproject 404 5
/sign_up.html 404 5
/reg.asp 404 5
/member.php 404 5
/modules.php 404 5
/tools/quicklogin.one 404 5
/logging.php 404 5
/register.php 404 5
/signup.php 404 5
/member/register 404 5
/forum/member/register 404 5
/tiki-register.php 404 4
/login.php 404 4
/CreateUser.asp 404 4
/bokeindex.asp 404 4
/registration_rules.asp 404 4
/profile.php 404 4
/ucp.php 404 4
/member/index_do.php 404 4
/account/register.php 404 4
/register.aspx 404 4
/post.php 404 4
/join.php 404 4
/join_form.php 404 4
/site/signup.php 404 4
/blogs/load/recent 404 4
/member/join.php 404 4
/content/knoesis 404 3
/calendar 404 3
/Class/Post.asp 404 3
/forums/index.php 404 3
/member/register.php 404 3
/member.php/register.php 404 3
/reg.php 404 3
/entertainment 404 3
/administrator/index.php 404 2
/content/semantic-web-lab 404 2
/content/sourceforge 404 2
/content/apache-software-foundation 404 2
/content/second-life 404 2
/content/world-wide-web-consortium-w3c 404 2
/aggregator 404 2
/nexus/WebIDauthentica... 404 2
/content/linked-data-connect-distributed-data-across-web 404 2
/content/opensimulator 404 2
/nexus/sessionmodel/1234567890 404 2
/weblinks/goto/146 404 2
/content 404 2
/content/planet-rdf 404 2
/nexus/screenshots1021 404 2
/content/audacity 404 1
/ebfiles/js/+d.src+ 404 1
/sites/all/modules/lightbox2/js/+src+ 404 1
/ns 404 1
/nexus/2011-02-19 404 1
/taxonomy/term/ht418-757e26.757046,-3.423891,6.078216 404 1
/taxonomy/term/ht4.3405969js 404 1
/taxonomy/term/ht17.444o1/aationsa 404 1
/taxonomy/term/h/lps-r-Llsll.</p 404 1
/taxonomy/term 404 1
/content/openlink-virtuoso 404 1
/content/mit-simile 404 1
/filter 404 1
/tags 404 1
/nexus/blog 404 1
/blog 404 1
/250 404 1
/calendar/2010-11-19 404 1
/ eBremer 404 1
/node/35/rdf 404 1
/content/stellarium 404 1
/nex/ses/7548c5d4-8ea8-40e8-8726-fa8819a62fe6 404 1
/content/tetherless-world-constellation 404 1
/content/blue-mars 404 1
/content/blender 404 1
/magazine.html 404 1
/register 404 1
/index.asp 404 1
/blog/1/feed 404 1
/blog/1/atom.xml 404 1
/blog/1/index.atom 404 1
/blog/1/index.rdf 404 1
/blog/1/rss.xml 404 1
/blog/1/index.xml 404 1
/blog/1/index.rss 404 1
/node/736 404 1
/content/netbeans 404 1
/feed-item/192 404 1
/calendar/2010-10-18 404 1
/content/open-colbalt 404 1
/fck/editor/filemanager/upload/test.html 404 1
/fckeditor/editor/filemanager/upload/test.html 404 1
/adm/fckeditor/editor/filemanager/upload/test.html 404 1
/_admin/FCKeditor/editor/filemanager/upload/test.html 404 1
/nexus/WebIDauthenticat 404 1
/content/digital-enterprise-research-institute-deri 404 1
/users 404 1
/nexus/scd6-ao 404 1
/nexus/2012-06-10 404 1
/aggregator/sources/3 404 1
/blog/1 404 1
/eblog/2009/06/18 404 1
/links 404 1
/monolith/video 404 1
/nexus/2010-07-25 404 1
/nexus/2010-07-28 404 1
/node/12465 404 1
/node/9664 404 1
/nexus/**WebIDauthentication<http://www.ebremer.com/nexus/WebIDauthentication 404 1
/node/addindex.php 404 1
/sites/all/modules/lightbox2/js/unescape 404 1
/nexusindex.php 404 1
/nexus/signup 404 1
/nexus/tiki-register.php 404 1
/nexus/user/register 404 1
/nexus/sign_up.html 404 1
/nexus/Class/Post.asp 404 1
/nexus/reg.asp 404 1
/nexus/login.php 404 1
/nexus/member.php 404 1
/nexus/index.php 404 1
/nexus/modules.php 404 1
/nexus/logging.php 404 1
/nexus/register.php 404 1
/nexus/CreateUser.asp 404 1
/nexus/bokeindex.asp 404 1
/nexus/signup.php 404 1
/nexus/forums/index.php 404 1
/nexus/registration_rules.asp 404 1
/nexus/profile.php 404 1
/nexus/ucp.php 404 1
/nexus/member/index_do.php 404 1
/nexus/account/register.php 404 1
/nexus/register.aspx 404 1
/nexus/post.php 404 1
/nexus/join.php 404 1
/nexus/join_form.php 404 1
/nexus/site/signup.php 404 1
/nexus/blogs/load/recent 404 1
/nexus/User/Register.aspx 404 1
/nexus/member/join.php 404 1

Query #2 Results

referrer visitors
- 958
http://www.google.com/blank.html 23
http://www.wowza.com/forums/showthread.php?13973-Integrating-Wowza-server-with-Drupal 14
https://www.google.com/ 12
http://www.google.co.in/blank.html 8
http://www.google.it/blank.html 7
http://www.wowza.com/forums/showthread.php?14188-Live-stream-and-vod-on-Drupal-7-website 7
http://www.wowza.com/forums/showthread.php?8153-Video-Streaming-Management-System 6
http://www.google.com.br/blank.html 6
http://www.google.com.au/blank.html 5
http://drupal.org/node/1402870 5
http://drupal.org/sandbox/ebremer/1775354 4
http://nayra.ru/ 4
http://saldoconsult.ru/ 4
http://niko-avto.ru/ 3
http://avtogury.ru/ 3
http://www.google.com.mx/blank.html 3
http://www.google.nl/blank.html 3
https://www.google.co.uk/ 3
http://www.google.com.tr/blank.html 3
https://www.google.it/ 2
http://www.google.com.sa/blank.html 2
http://www.google.co.uk/blank.html 2
http://www.google.com.ar/blank.html 2
http://adtimes.ru/ 2
http://avena.com.ua/ 2
https://www.google.co.jp/ 2
http://www.google.gr/blank.html 2
http://parket-k.ru/ 2
http://sovetogorod.ru/ 2
http://www.odeialo.ru/ 2
http://busmaster.by/ 2
http://les-femmes.ru/ 2
http://rumagic.com/ 1
http://www.mydoctor-ufa.ru/ 1
http://cafemam.ru/ 1
http://www.prostitutki-volgograda.org/ 1
http://www.google.com.qa/blank.html 1
http://www.google.co.za/blank.html 1
http://www.sogou.com/sogou?query=www%2C4b4b%2Ccom&ie=utf8&_ast=1363804416&_asf=null&w=04023100&pid=sogou-site-dcda54e29207294d&duppid=1&p=50040111&dp=1&sut=19746&sst0=1363804478701 1
http://www.google.fr/search?q=opensimulator&hl=fr&client=safari&source=lnms&tbm=isch&sa=X&ei=bTFKUZGlAcTEPdiYgKAL&ved=0CAgQ_AUoAQ&biw=480&bih=268 1
http://www.google.com/search?hl=en&site=&source=hp&q=3d+dna+strand+model&oq=3+D+DNA+strand&gs_l=mobile-gws-hp.1.1.0i13j0i13i30l3j0i22i10i30.12744.44483.0.48874. 1
http://www.google.nl/search?hl=nl&client=safari&q=3d+graphs+in+r&bav=on.2,or.&biw=1024&bih=672&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi&ei=si9KUb6KIo21Pa3UgPAM 1
http://www.prostitutki-tyumeni.org/ 1
http://mywbs.com 1
http://www.tostead.ru/ 1
http://web-knb.ru/ 1
http://dorklin.ru/ 1
https://www.google.no/ 1
http://www.prostitutki-ekaterinburga.org/ 1
http://android-xxl.com/ 1
http://wmcash-change.com/ 1
http://blog.curiouslydam.com/xxldvd.php?q=llrezobject-key&page=4 1
http://www.google.co.ve/blank.html 1
http://www.google.com.br/search?hl=pt-BR&biw=1280&bih=800&tbm=isch&sa=1&q=DNA+3D&oq=DNA+3D&gs_l=img.3..0.16820.29449.0.30614. 1
http://remont-mobile-phones.ru/ 1
http://onlinekinovse.ru/ 1
http://pkzona.ru/ 1
http://www.sim-bler.ru/ 1
http://www.kanstovar.ru/ 1
http://www.google.com.my/search?hl=en&client=ms-android-samsung&v=133247963&biw=320&bih=508&tbm=isch&sa=1&q=visualization&oq=visual&gs_l=mobile-gws-serp.1.0.41j0l4.8930.15514.0.24288. 1
http://sanyamanya.ru/ 1
http://forexjobs.biz/ 1
http://www.google.it/search?um=1&hl=it&safe=active&biw=1024&bih=672&tbm=isch&sa=1&q=dna+3d&oq=DNA+&gs_l=img.1.0.0l10.240237.240237.0.242725. 1
http://callpartner.biz/ 1
http://gilina.ru/ 1
http://emigrant.name/ 1
http://www.google.de/search?q=html5++3d+filetype%3Apdf&hl=de&lr=lang_en&tbs=lr%3Alang_1en&oq=html5++3d+filetype%3Apdf&gs_l=heirloom-serp.12...106999.110286.0.112616. 1
http://www.prostitutki-surguta.org/ 1
http://glavprofit.ru/ 1
http://www.finddotcom.com/ 1
http://www.google.com/search?hl=en&safe=active&biw=1024&bih=672&tbm=isch&sa=1&q=ideas+of+a+DNA+model&oq=ideas+of+a+DNA+model&gs_l=img.3...169959.191853.0.192353. 1
http://google-play-soft.ru/ 1
http://planovik.ru/ 1
http://www.google.com/search?q=examples+of+DNA+3D+models&hl=en&rlz=1Y1TXGW_enUS514US521&source=lnms&tbm=isch&sa=X&ei=DddMUcikB8fB2wW52oDIDQ&ved=0CAgQ_AUoAQ&biw=360&bih=567&sei=FNdMUaDBLKfg2QWD_IHgDg 1
http://www.google.com/search?q=dna+model+project+ideas&hl=en&biw=1024&bih=672&tbm=isch&source=lnms&sa=X&ei=O-pMUYnQE4W2qQHNvYCICA&ved=0CAYQ_AUoAQ 1
http://saascenter.ru/ 1
http://www.google.com/search?hl=cs&tbm=isch&sa=1&q=molucular+visualization&oq=molucular+visualization&gs_l=img.3...4830.21572.0.22854. 1
http://www.google.com/search?hl=cs&tbm=isch&sa=1&q=molucular+visualization+gpl&oq=molucular+visualization+gpl&gs_l=img.3...140246.142899.0.143579. 1
http://lineage2club.ru/ 1
EBREMER.COM/wp-login.php 1
http://www.google.pt/blank.html 1
http://www.vse-prostitutki.org/ 1
http://www.google.com/search?hl=en&site=&source=hp&q=dna+model+ideas+for+kids&oq=dna+ideas&gs_l=mobile-gws-hp.1.4.0j0i22i30l4.31549.41108.0.49253. 1
http://www.google.com/search?hl=en&biw=1024&bih=607&site=imghp&tbm=isch&sa=1&q=3d+dna+model+labeled&oq=3d+dna+model+la&gs_l=img.1.0.0i24.16197.16912.0.18880. 1
http://www.baidu.com/s?wd=3DRDFFOAFinWebGL-HTML5linkedtoOpenSimulator%7CeBremer 1
http://salonmatrix.ru/ 1
http://www.prostitutki-omska.org/ 1
http://proficomp.net/ 1
http://www.ydivis.ru/ 1
http://barsavto.ru/ 1
http://magnetfox.com/ 1
http://android-directory.ru/ 1
http://www.google.dk/search?hl=da&biw=320&bih=504&tbm=isch&sa=1&q=node&oq=node&gs_l=mobile-gws-serp.3...167220.169853.0.170614. 1
http://www.dixi-wild.com/ 1
http://www.google.co.nz/search?hl=en&site=imghp&tbm=isch&sa=1&q=dna+structure+3d&oq=dna+structure&gs_l=img.1.1.0l10.49464.50402.0.57537. 1
http://zena-na-chas-moscow.ru/ 1
http://www.google.com.pk/blank.html 1
http://rusexphone.com/ 1
http://www.prostitutki-kharkova.org/ 1
http://web-betting.ru/ 1
http://wap4android.ru/ 1
http://nirmala.com.ua/ 1
http://www.google.com.br/search?hl=pt-BR&site=webhp&tbm=isch&source=hp&q=dna+3d&oq=dna&gs_l=mobile-gws-hp.1.1.0l5.5376.10614.0.14232. 1
http://canadausa.9bb.ru 1
http://www.google.com/search?hl=en&biw=320&bih=416&tbm=isch&sa=1&ei=k_VQUaeNKsXriwKm-IDwDQ&q=dna+model+ideas&oq=dna+model+i&gs_l=mobile-gws-serp.1.0.0l2j0i5l2j0i24.132938.138127.0.139718. 1
http://www.ooo-v-samare.ru/ 1
http://www.google.com/search?q=location+digital+dna&hl=en&client=safari&source=lnms&tbm=isch&sa=X&ei=EytRUaTVDMjj4APl9oGwDg&ved=0CAYQ_AUoATgK&biw=1024&bih=644 1
http://www.wallpapers.su/ 1 1
http://dom-spain.ucoz.ru/ 1
http://ledotape.net/news.php?readmore=10 1
http://www.denigma.de/links/871 1
http://www.google.com/search?hl=en&biw=1024&bih=672&tbm=isch&sa=1&ei=PzZSUZvVDMjdigLNm4HYAw&q=dna+3d+model+project+ideas&oq=dna+3d+model+project+&gs_l=img.1.0.0i24.111894.111894.0.113551. 1
http://interservis.info/ 1
http://www.google.com/search?hl=en&biw=320&bih=416&tbm=isch&sa=1&ei=SiFSUezBN5XI4AOUk4GwCg&q=3d+dna+model+ideas&oq=dna+model+ideas&gs_l=mobile-gws-serp.1.1.0j0i5l2j0i24l2.8991694.8993979.0.8995631. 1
http://cncmotors.ru/ 1
http://www.google.com/search?hl=en&client=ms-android-verizon&site=webhp&tbm=isch&sa=1&ei=d9pSUbDjPJK14AOdkoGABA&q=3d+dna+model+project+ideas&oq=3d+dna+model&gs_l=mobile-gws-serp.1.1.0l5.12090.12906.0.14569. 1
http://www.google.com/search?hl=en&q=easy+dna+model+project&revid=1722947479&sa=X&ei=LexSUcaOEMPCqQG85YD4Bg&ved=0CG8Q1QIoBQ&biw=320&bih=505 1
http://evro-schengen.ru/ 1
http://www.prostitutki-vladivostoka.org/ 1
http://www.prostitutki-kaliningrada.org/ 1
https://www.google.lv/ 1
http://lentenet.rolevaya.net 1
http://www.traders-co.ru/ 1
http://mskinweb.ru/ 1
http://lenterda.net/news.php?readmore=66 1
http://www.prostitutki-astana.org/ 1
https://www.google.com.ec/ 1
http://ajilbab.com/open/open-pdb-files.htm 1
http://en.mylandsgame.info/ 1
http://www.google.co.nz/search?hl=en&site=imghp&tbm=isch&source=hp&q=g+spo&oq=g+spo&gs_l=img.3...26414.31488.0.32755. 1
http://www.google.com.tr/imgres?q=dna+3d&hl=tr&safe=active&as_qdr=all&biw=1366&bih=624&tbm=isch&tbnid=GNR5hrmgT2yWnM:&imgrefurl=http://erayushi.com/category/biotechnology/&docid=0gAofinTJmn0xM&imgurl=http://erayushi.com/wp-content/uploads/EasyRotatorStorage/user-content/erc_38_1339076817/content/assets/gc6-0.jpg&w=1600&h=1200&ei=lWJUUZrRCsKbtAbSkoGoDQ&zoom=1&ved=1t:3588,r:0,s:0,i:76&iact=rc&dur=190&page=1&tbnh=179&tbnw=229&start=0&ndsp=18&tx=136&ty=39 1
http://plutoncosmos.net/news.php?readmore=93 1
http://usakanler.net/ 1
http://www.sexhdtube.net/ 1
http://android-calendar.ru/ 1
http://funpromo.ru/shop 1
http://www.google.com/search?q=visualization&hl=en&client=ms-android-att-us&source=android-browser-type&v=133247963&ei=BjFVUaaIG-bg0QGbmIDgCw&start=10&sa=N&biw=320&bih=508 1
http://oneweb.ru/ 1
http://www.google.ca/search?redir_esc=&redir_esc=&hl=en-CA&client=ms-android-samsung&source=android-browser-type&v=210020311&qsubts=1364560799456&q=dna%20model%20example 1
http://x-freelance.com/ 1
http://www.google.com/search?q=dna+model+ideas&hl=en&tbm=isch&tbo=u&source=univ&sa=X&ei=oP1VUcGHJIa90AHwz4CQDQ&ved=0CC0QsAQ&biw=768&bih=928#biv=i%7C34%3Bd%7C2AosWrluA49PsM%3A 1
https://www.google.ca/ 1
http://www.films4apple.ru/ 1
http://www.google.ru/blank.html 1
http://www.adriftskateshop.com/actress420 1
http://mag.dzyuba.org.ua/ 1
http://www.mart-an.ru/ 1
http://kinofun.kz/ 1
http://ranselem.net/news.php?readmore=67 1
http://master-remont-tehniki.ru/ 1
https://www.google.co.ve/ 1
http://drupal.org/user/103776 1
http://torrentland.biz 1
http://www.prostitutki-lipetska.org/ 1
http://www.prostitutki-minska.org/ 1
http://www.prostitutki-novgoroda.org/ 1
http://mywbs.com/profile.php?handle=aroulgesordus 1
http://pozitivplus.net/ 1
http://www.prostitutki-krasnoyarska.org/ 1
http://getseo.co.il/ 1
http://masecloud.net/ 1
http://parketpeterburg.ru/ 1
http://renkele.net/news.php?readmore=73 1
http://EBREMER.COM/fck/editor/filemanager/upload/test.html 1
http://EBREMER.COM/fckeditor/editor/filemanager/upload/test.html 1
http://EBREMER.COM/adm/fckeditor/editor/filemanager/upload/test.html 1
http://EBREMER.COM/admin/FCKeditor/editor/filemanager/upload/test.html 1
http://EBREMER.COM/_admin/FCKeditor/editor/filemanager/upload/test.html 1
http://polso.multimedia.uom.gr/mmw/node/1 1
http://www.google.com/search?hl=en&biw=320&bih=504&tbm=isch&sa=1&ei=MqlYUce_D_e14APFh4DYBA&q=3d+dna+model+school+project+examples&oq=3d+dna+model+school+project+examples&gs_l=mobile-gws-serp.3...41759.54091.0.54254. 1
https://www.google.co.za/ 1
http://www.google.ca/blank.html 1
http://www.ubagsmart.com/ 1
http://diggit.drupalextras.com/node/117718/related_links 1
http://images.search.yahoo.com/images/view;_ylt=A2KJkPt4aFlR6ikAhqiJzbkF;_ylu=X3oDMTBlMTQ4cGxyBHNlYwNzcgRzbGsDaW1n?back=http%3A%2F%2Fimages.search.yahoo.com%2Fsearch%2Fimages%3Fp%3DDNA%2B3d%26n%3D30%26ei%3Dutf-8%26y%3DSearch%26fr%3Dyfp-t-671%26tab%3Dorganic%26ri%3D11&w=500&h=242&imgurl=www.skeptic.com%2Feskeptic%2F07-07-11images%2Fdna_strand.jpg&rurl=http%3A%2F%2Fwww.skeptic.com%2Feskeptic%2F07-07-11%2F&size=35.7+KB&name=Skeptic%3A+Examining+Extraordinary+Claims+and+Promoting+Science&p=DNA+3d&oid=db4944f531a238ba141306d2c8d00090&fr2=&fr=yfp-t-671&tt=Skeptic%253A%2BExamining%2BExtraordinary%2BClaims%2Band%2BPromoting%2BScience&b=0&ni=96&no=11&ts=&tab=organic&sigr=119ue3iqk&sigb=13bjh2dai&sigi=11m7nh5ea&.crumb=o14aq5RbBFo 1
http://pc.su/ 1
http://www.bing.com/images/search?q=Lithium+Medication&FORM=RESTAB 1
http://ranselem.net/news.php?readmore=76 1
http://www.google.com/search?q=dna+visualization&hl=en&source=lnms&tbm=isch&sa=X&ei=WU9aUdfEAYnUqgHb7ICwDw&sqi=2&ved=0CAcQ_AUoAA&biw=800&bih=1280 1
http://sitetourism.com/ 1
http://www.google.com.hk/blank.html 1
http://ranedaly.net/ 1
http://masecloud.net/news.php?readmore=73 1
http://finans-book.com/ 1
http://www.bing.com/images/search?pq=data+visualization+3d&sc=3-21&sp=-1&sk=&q=data+visualization+3D&qft=+filterui:imagesize-large&FORM=R5IR3 1
http://plutoncosmos.net/ 1
http://spb.ceramic.ru/ 1
http://master-muznachas.ru/ 1
http://www.google.com/search?q=really+cool+DNA+model+design+ideas&hl=en&client=ms-android-sprint-us&gl=us&source=android-launcher-search&source=lnms&tbm=isch&sa=X&ei=zo5bUcDrFtPaqQHy_4CwAQ&ved=0CAgQ_AUoAQ&biw=320&bih=344&sei=045bUaP6G4n2qQGVt4HYAw 1
http://www.youtube.com/watch?v=Wvw9tq7difg&feature=player_embedded 1
http://www.google.com/search?hl=en&client=ms-android-uscellular-us&v=134000000&tbm=isch&sa=1&ei=Ox1cUYjmEISo2gWBq4G4Cw&q=things+to+do+for+dna+3d+model+project&oq=things+to+do+for+dna+3d+model+project&gs_l=mobile-gws-serp.12...208859.219752.0.221715. 1
http://www.prostitutki-krasnodara.org/ 1
https://www.google.fr/ 1
http://flavors.me/dilmovirca 1
http://www.google.com/imgres?imgurl=https://gephi.org/wp-content/uploads/2011/08/Google-ChromeScreenSnapz001.png&imgrefurl=https://gephi.org/2011/gsoc-mid-term-graphgl-network-visualization-with-webgl/&h=429&w=600&sz=204&tbnid=d7f4uapIIUoFDM:&tbnh=83&tbnw=116&prev=/search%3Fq%3DgraphGL%26tbm%3Disch%26tbo%3Du&zoom=1&q=graphGL&usg=__6alqQpcoUiG7OthJA_w8qEq18II=&docid=GziQ_A5aS6fPOM&hl=en&sa=X&ei=wm9cUcb3GtDPqwHY14H4Bw&ved=0CEYQ9QEwBA&dur=464 1
http://www.google.com/search?hl=en&site=&source=hp&ei=K-RcUb6RArbj4AOLz4DYAw&q=3d+model+of+dna+project&oq=3d+modelo+Of+dna&gs_l=mobile-gws-hp.1.3.0i13l5.8542.49697.0.53279. 1
http://ranselem.net/news.php?readmore=74 1
http://tovray.ru/ 1
http://www.google.com.ua/blank.html 1
http://1vent.ru/ 1
http://pammpartnerr.ru/ 1
http://forums.kitely.com/viewtopic.php?f=34&t=123 1
http://lenterda.net/ 1
http://studycomets.net/news.php?readmore=90 1
http://www.google.co.in/search?hl=en&q=visualization&bav=on.2,or.&bvm=bv.44770516,d.Yms&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi&ei=FKhdUfKgGsqJtQbziIGACg&biw=768&bih=928&sei=ZahdUeO_DsadtAag2YGYBg 1
http://lampokrat.ucoz.ru/ 1
http://landteme.net/ 1
http://low-price-moscow-taxi.ru/ 1
https://www.google.com.co/ 1
http://www.bing.com/images/search?q=lithium+carbonate&FORM=HDRSC2 1
http://cn.bing.com/images/search?q=DNA+store+data&go=&qs=n&form=QBIR&pq=dna+store+data&sc=0-3&sp=-1&sk= 1
http://webcache.googleusercontent.com/search?q=cache:cSfLNjeNDtwJ:www.wowza.com/forums/showthread.php%3F13973-Integrating-Wowza-server-with-Drupal+&cd=1&hl=id&ct=clnk 1
http://www.google.com.ph/blank.html 1
http://opel.barsavto.ru/ 1
http://www.bing.com/search?q=Erich+Bremer%2C+Stony+Brook&src=ie9tr 1
http://online.liebertpub.com/doi/pdfplus/10.1089/big.2012.0004 1
http://mug-na-chas-moscow.ru/ 1
http://www.prostitutki-novosibirska.org/ 1
http://ledotape.net/news.php?readmore=66 1
http://www.prostitutki-irkutska.org/ 1
http://nalroken.net/ 1
http://www.google.com.vn/blank.html 1
http://remont-ustanovka-tehniki.ru/ 1
http://neo-team.info/ 1
http://plantewater.net/news.php?readmore=66 1
http://www.google.dk/search?hl=da&site=webhp&tbm=isch&source=hp&q=node&oq=node&gs_l=mobile-gws-hp.3..0l5.3986.4989.0.5616. 1
http://eroticbeauties.ru/ 1
http://masteralke.net/ 1
http://www.google.ru 1
http://www.google.co.nz/blank.html 1
http://t.co/Weie3aTs 1
http://pereezd-kvartir-office.ru/ 1
http://www.google.com/search?q=dna+model+ideas&hl=en&sa=X&tbm=isch&tbo=u&source=univ&ei=V65hUdLuJq3h4AP2wYDIAQ&ved=0CDMQsAQ&biw=320&bih=356&sei=arFhUYiwOafD4APZyYCoCA 1
http://ledotape.net/news.php?readmore=72 1


Nexus Project: WebGL Client/Server Communications Test using RDF over WebSockets

 A video from a July 25, 2011 showing the first successful test run of my Nexus Project's WebGL client/server communications using HTML5 WebSockets rather than http polling.  This visualization shows Friend of a Friend (FOAF) RDF graph data being displayed in 3D as it's layout is being determined by a 3D force-directed layout algorithm.  I got tired of digging up the video on my iPhone to show people so I decided to post it.  There have been many things done since this video (latest browser support, Jetty 8, GLGE 0.9, speed improvements, and better screen capture than my iPhone too ;-)  I have been considering a different RDF serialization rather than N-TRIPLES since N-TRIPLES since it is hopelessly uncompressed, but it made for the easiest implementation since N-TRIPLE parsers are easy to write in javascript.  Jena also supports N-TRIPLES serialization so nothing had to be done on the server end of things.  I was just at the ISWC 2012 in Boston and it was suggested to me to use Turtle RDF (I was also considering JSON-LD or even the binary RDF format), but honestly, the speed of N-TRIPLES is sufficient for now and I would rather work towards a first release of the software.  It's too aluring to endlessly tinker (and I love to tinker by the way).


RDF Triples over HTML5 WebSockets

From the beginning, I wanted Nexus to be a collaborative visualization system allowing multiple clients in multiple locations to see the same visualizations in real-time.  The issue that arises here is knowing "where" in the 3D semantic web visualization the other clients (people/avatars) are and what direction they are looking at.  In the 3D digital world, you have the concept of a "camera".  This is essentially your point-of-view in a particular 3D simulation.  As the camera moves, your view of the model changes as well.  In order to know where the other clients are in the simulation, the camera position and rotation data on all clients are converted to RDF triples and then sent to the Nexus server to be resent and synchronized to all other clients.  Nexus eats, breathes, and internalizes everything as RDF.  HTTP polling would not work well as a transport for these triples, especially with a dozen or more clients all trying to sychronize with each other.  The solution is sending the RDF N-Triples using the HTML5 WebSocket protocol. 

What are WebSockets?  The WebSocket protocol is a bi-directional, full-duplex communications protocol that is part of the HTML5 specification.  WebSockets allow my WebGL clients to talk back and forth with the Nexus server without resorting to http polling.  I will be adding WebSockets to my OpenSimulator client as well.

I've embedded Jetty in Nexus so Apache Tomcat is no longer necessary to run Nexus which simplifies the deployment of the Nexus server software.  Jetty also has a nice clean HTML5 WebSockets implementation and allows me to do both http and WebSockets on the same ip and port.  Nexus client/server communications are all just streams of RDF triples going in both directions using the HTML5 WebSockets protocol.

Here is my poster for my 2011 Gordon Conference on Visualization in Science and Education that I did a couple weeks ago where I presented the progress so far on Nexus.



Nexus WebGL 3D RDF client in Technicolor

It took less time than I thought it would, but here is an updated version of the 3D FOAF graph from my last posting with node sizes determined by the log base 10 of the number of links into a particular node.  The coulombs law for the larger nodes is adjusted so that larger nodes "push" out harder to accomodate the larger spheres preventing sphere clashes.  This images was taken with the WebGL running in Chrome.

Next on the agenda for additional functionality is the actual display of text labels over subjects, predicates, and objects.  Also to be added is WebGL camera and avatar positioning data.  What's this?  In the Opensimulator client, dozens of people can view and interact with the same RDF model/structure.  Where one of those people are looking or focusing their attention is indicated by their 3D cursor or avatar.  However, this leaves the WebGL client users in the dark as to what the OpenSimulator users and/or other WebGL clients are doing in the simulation.  I am planning to synchronize this information between all of the clients by streaming the avatar (or camera position data in the case of WebGL) back to the Nexus server where it will be pushed out to all clients in the form of more RDF triples.

The SPARQL commands for the colors and such for this image are as follows:

1) Make everything blue
insert {?rnode <nex:color> "0,0,1"} where {?node <nex:rnode> ?rnode}
insert {?pnode <nex:color> "0,0,1"} where {?node <nex:pnode> ?pnode}

2) Color white all literals
insert {?lnode <nex:color> "1,1,1"} where {?node <nex:lnode> ?lnode}

3) Color red all triples that are of foaf:knows
modify delete {?rnode <nex:color> "0,0,1"} insert {?rnode <nex:color> "1,0,0"}  where {?node <nex:rnode> ?rnode . ?node foaf:knows ?o }
modify delete {?pnode <nex:color> "0,0,1"} insert {?pnode <nex:color> "1,0,0"}  where {?node <nex:pnode> ?pnode . ?node rdf:predicate foaf:knows }

4) color green all triples of type rdf:type
modify delete {?rnode <nex:color> "0,0,1"} insert {?rnode <nex:color> "0,1,0"}  where {?node <nex:rnode> ?rnode . ?node rdf:type ?o }
modify delete {?pnode <nex:color> "0,0,1"} insert {?pnode <nex:color> "0,1,0"}  where {?node <nex:pnode> ?pnode . ?node rdf:predicate rdf:type }

5) Make everything shiny
insert {?rnode <nex:shiny> "3"} where {?node <nex:rnode> ?rnode}
insert {?pnode <nex:shiny> "3"} where {?node <nex:pnode> ?pnode}
insert {?lnode <nex:shiny> "3"} where {?node <nex:lnode> ?lnode}

Yes, I am planning on coming up with a far easier interface for the user other than SPARQL. :-)


3D RDF FOAF in WebGL-HTML5 linked to OpenSimulator

The adjacent image is of Tim Berners-Lee's FOAF file imaged with a new HTML5 / WebGL client I am developing for my Nexus RDF visualization server. WebGL allows for sophisticated 3D graphics within a web browser with no plug-in required.  The visualization is in 3D with a layout determined by a force-directed algorithm driven by the Nexus server.  The below color image is also Tim Berners-Lee's FOAF file, imaged in the same fashion, but from within an OpenSimulator region.  The twist is that both images are created off of the same server session.  In other words, the session is occuring concurrently in the HTML5/WebGL client and the OpenSimulator region allowing multiple users in the OpenSimulator region to collaborate in real-time with multiple HTML5 / WebGL clients.

In the intial testing/debugging of the HTML5 / WebGL client, I was able to get 14-16 frames per second using FireFox 5 (beta).  Greater frame rates were achievable in testing with Chrome.

To speed the development of the HTML5 /WebGL client, I made use of Paul Brunt's GLGE WebGL library which is an amazing piece of work in itself.  Currently, N-triples over HTTP is used to communicate between the clients and the server, but WebSockets is being explored.

The OpenSimulator client avoids the use of the standard OpenSim object inventory for object handling by using an RDF store with dereferenceable URIs.

Hopefully, in the next couple of weeks I will have color and variable nodesizes debugged.


SPARQL 1.1 Controlled 3D RDF Visualization - from a Force-Directed Layout to a Molecular Visualization of DNA using Nexus in OpenSimulator

Nexus is an experiment with Semantic Web RDF data visualized in three dimensiodians that can be done collaboratively amongst many people (and concurrently) at disparate locations.  Nexus also acts as a platform to try out various design ideas, technologies, and methodologies.  The original Nexus design read and displayed RDF data and could also export it.  I have reworked the back-end of Nexus to use RDF internally and to communicate with its front-end client(s) in pure N-Triples.  The internal RDF representation enables the use of SPARQL (the query language for RDF) via Jena ARQ to manipulate the RDF graph and thus the over-all visualization.  In this posting, I will show the SPARQL 1.1 commands used to manipulate the structural data of a strand of DNA that has been converted to RDF from the original PDB format.  The resulting display will be shown as a force-directed layout and then manipulated into a physical RDF layout determined by crystal structure coordinates contained within the RDF.  Essentially, this will allow for molecular visualization within Nexus allowing us to actually see the strand of DNA in a physical form.

Basic Visualization Design Concepts in Nexus
The basic unit of information we want to visualize is the RDF triple:

Subject - Predicate - Object

In keeping with the "pure RDF" concept, this triple would be annotated with a RDF triples using a display ontology designed for Nexus, it's prefix being "nex".  Statements like nex:color, nex:xyz, nex:glow, nex:nodesize could be made about any resource whether it be subject or object.  For each resource, a "display node" triple is introduced and attached to the original rdf resource. RDF nex statements would then be made about that display node.  For example:

?s ?p ?o
?s nex:rnode ?displaynode
?displaynode nex:color "1,0,0" (red)
?displaynode nex:xyz "2.34,7.34,1.23"e
?displaynode rdf:type nex:sphere
?displaynode nex:radius "3.4"
    and so on.....

Adding this "display node" layer added a large degree of flexibility for RDF displays.  At one point, the display nodes were represented as blank nodes, but in the current version of Nexus, I converted these to resources.  It was just easier to work with in this way.

Fun with RDF Reification
Visualization nodes cannot be attached directly to predicates and literals because RDF statements cannot be made about predicates or literals.  You can only make RDF statements about resources.  However, you can make statements about statements through a process known as RDF reification.  The triples for a single reified statement for nexus would look as follows:

?s ?p ?literal  (statement to be visualized)

The following RDF statements attach a display node to the predicate (?p) and literal (?literal)

?viznode rdf:type rdf:Statement
?viznode rdf:subject ?s
?viznode rdf:predicate ?p
?viznode rdf:object ?literal
?viznode nex:pnode ?displaynode
?viznode nex:lnode ?displaynode

No, RDF reification is not pretty, I know, I'm not a fan of the syntax, but it does allow you to make statements about other statements, and in my case, be used to make indirect statements about specific predicates and literals without having to modify any of the ontologies or resorting to use named graphs (not that this method is bad, I just haven't thought about it yet much).  So, at this point, we have three kinds of display nodes - rnodes (for resources), pnodes (for predicates), and lnodes (for literals).  These three types are actually all the same, but by assigning them different names it is easier to distinguish them from each other when querying the RDF.  This could have been done with a rdf:type statment but this was a bit more compact.  I may or may not change it later.  The W3C RDF working group had a recent discussion of whether RDF reification should be deprecated (see here).  I think the functionality of reification is needed, I just think it's syntax and design need to be re-worked.  For now, it is enabling me to do my arbitrary 3D visualizations.

OpenSimulator Object References
Rather than relying upon OpenSimulator's inventory mechanism and object ID system, objects are stored as RDF and assigned dereferencable RDF URI's which allow the objects to be accessed from remote OpenSimulator regions via the Nexus server code/triple store.  This will allow multiple regions (even if on different grids) to access concurrently the same RDF visualization.  The same RDF URI method could be used as a universal reference to refer to OpenSimulator users and groups (as well as the objects), RDF data interchange between OpenSimulator regions could also be quite handy, but that's another project for another day... :-)  For now, we'll see how well it works within Nexus.

Laying out the RDF Graph
Nexus implements a basic force-directed layout algorithm where the force of the nodes are modeled with Coulomb's Law and the predicates are modeled as springs with Hooke's Law.  When applying the force-layout to the loaded RDF graph (and this can be any RDF graph), the Nexus triples are ignored.  Later down the road, I would like to experiment with various modifications of the force-directed method and/or different methods all together.  I still have a bit of work to do on Nexus force-directed layout engine so that the results are more usable.

Sending the back-end RDF model to the front-end for visualization
The purpose of the front-end is to render the visualization nodes.  The RDF is pulled from the back-end using http and is sent purely as RDF N-Triples.  In an earlier version of Nexus, this was mostly RDF, now it is purely RDF.  When commands are needed to instruct the front-end to do things, the commands are sent as RDF triples.  For example, if I want the front-end to redraw the model, the back-end sends a triple about the session to the front-end as follows:

<http://www.ebremer.com/nexus/sessionmodel/1234567890> <nex:redraw> "true"  (an example)

Turning RDF into DNANexus - Semantic DNA
Back when I attended CSHALS 2010, I had started to write a pdb ontology to express PDB as RDF but shelved it to work on the core of Nexus.  No one else had an RDF representation of PDB that I could find.  Periodically, I checked, and finally during the summer of 2010 I discovered that the Michel Dumontier Lab had written a conversion for pdb and made the conversion program available (pdb2rdf).  And there was rejoicing in the streets!  I had a program now that could do the pdb (protein databank format) to RDF conversion.  The pdb file converted resulted in 16,473 triples.  It doesn't look like pdb2rdf transfers the bonding/connect information in the pdb files yet, so I'm limited to space-filled at the moment.  When the bond information gets added to the RDF conversion, I will be able to do ball and stick views as well.

Now, in order to turn the force directed graph into a visualization of DNA as seen in the first figure to that of the second figure, we would issue the following SPARQL 1.1 commands:

Step #1 - Set all display nodes visible property to false.  The nex:visible predicate tells the server whether to include that visualization node in the final display or whether to even consider it in the layout routines.

modify delete {?s <nex:visible> ?o} insert {?s <nex:visible> "0"} where {?s <nex:visible> ?o}

Step #2 - Set all display nodes visible property attached to atom nodes to true.  We use the predicate "pdb:hasSpatialLocation" to select atoms nodes since the atom nodes are the only nodes that have a spatial location.

modify delete {?rnode <nex:visible> ?o} insert {?rnode <nex:visible> "1"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc . ?rnode <nex:visible> ?o}

Step #3 - We now change the coordinates of the force-directed determined atoms (their visualization nodes) to the crystal-determined XYZ location by reconstructing a vector from the XYZ triples.

modify delete {?rnode <nex:xyz> ?o} insert {?rnode <nex:xyz> ?xyz} where {?atom <nex:rnode> ?rnode . ?rnode <nex:xyz> ?o . ?atom pdb:hasSpatialLocation ?loc . ?loc pdb:hasXCoordinate ?xc . ?loc pdb:hasYCoordinate ?yc . ?loc pdb:hasZCoordinate ?zc. ?xc pdb:hasValue ?x . ?yc pdb:hasValue ?y . ?zc pdb:hasValue ?z . let (?xyz := fn:concat(?x,",",?y,",",?z)) }

Step #4 - The following series of commands sets the nodesize (radius) of the atom visualization nodes to the values that represent the actual atomic radii of the various types of atom present in the structure.  If this data was entered into the system as RDF triples, these six commands could be reduced to one.

modify delete {?rnode <nex:nodesize> ?o} insert {?rnode <nex:nodesize> "1.0"} where {?atom <nex:rnode> ?rnode . ?atom rdf:type pdb:HydrogenAtom . ?rnode <nex:nodesize> ?o}

modify delete {?rnode <nex:nodesize> ?o} insert {?rnode <nex:nodesize> "2.8"} where {?atom <nex:rnode> ?rnode . ?atom rdf:type pdb:CarbonAtom . ?rnode <nex:nodesize> ?o}

modify delete {?rnode <nex:nodesize> ?o} insert {?rnode <nex:nodesize> "2.6"} where {?atom <nex:rnode> ?rnode . ?atom rdf:type pdb:NitrogenAtom . ?rnode <nex:nodesize> ?o}

modify delete {?rnode <nex:nodesize> ?o} insert {?rnode <nex:nodesize> "3.4"} where {?atom <nex:rnode> ?rnode . ?atom rdf:type pdb:PhosphorusAtom . ?rnode <nex:nodesize> ?o}

modify delete {?rnode <nex:nodesize> ?o} insert {?rnode <nex:nodesize> "2.4"} where {?atom <nex:rnode> ?rnode . ?atom rdf:type pdb:OxygenAtom . ?rnode <nex:nodesize> ?o}

modify delete {?rnode <nex:nodesize> ?o} insert {?rnode <nex:nodesize> "3.2"} where {?atom <nex:rnode> ?rnode . ?atom rdf:type pdb:SufurousAtom . ?rnode <nex:nodesize> ?o}

Step #5 - Now for a little flair, we set the shininess of the atom visualization nodes to a glossy metallic value, again, using the "hasSpatialLocation" predicate to pick out the atom nodes.

insert {?rnode <nex:shiny> "3"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc}

Step #6 - We now color all atom visualization nodes to blue

insert {?rnode <nex:color> "0,0,1"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc}

Step #7 - The next five commands color the backbone of the DNA green by selecting atom nodes with a name in the form *' and *'', the backbone atom labels are traditionally labeled with apostrophe and double apostrophe. The last three commands handle the phosphates.

modify delete {?rnode <nex:color> ?o} insert {?rnode <nex:color> "0,1,0"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc . ?atom rdfs:label ?name . ?rnode <nex:color> ?o . filter regex (?name, "''")}

modify delete {?rnode <nex:color> ?o} insert {?rnode <nex:color> "0,1,0"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc . ?atom rdfs:label ?name . ?rnode <nex:color> ?o . filter regex (?name, "'")}

modify delete {?rnode <nex:color> ?o} insert {?rnode <nex:color> "0,1,0"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc . ?atom rdfs:label ?name . ?rnode <nex:color> ?o . filter regex (?name, "P")}

modify delete {?rnode <nex:color> ?o} insert {?rnode <nex:color> "0,1,0"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc . ?atom rdfs:label ?name . ?rnode <nex:color> ?o . filter regex (?name, "OP1")}

modify delete {?rnode <nex:color> ?o} insert {?rnode <nex:color> "0,1,0"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc . ?atom rdfs:label ?name . ?rnode <nex:color> ?o . filter regex (?name, "OP2")}

Step #8 - Lastly, we set the phosphor atom display nodes to glow by inserting nex:glow statements attached to the corresponding phosphor atom display nodes.

insert {?rnode <nex:glow> "0.2"} where {?atom <nex:rnode> ?rnode . ?atom pdb:hasSpatialLocation ?loc . ?atom rdfs:label ?name . filter (?name="P")}

The resulting 3D RDF graph now looks like a DNA model that I had done with my prior Monolith project which dealt exclusively with non-RDF PDB-formatted data.  The DNA structure can be colored and effects set in many different ways by using the powerful new SPARQL 1.1 query language using any of the data present in the loaded RDF graph, not just what is displayed.  We can even access remote SPARQL end points and include their data as well.  Since Nexus handles any RDF, we are not limited to just molecular visualization.  We can branch off into other linked data by using the PubMed ID triple present into the RDF-converted PDB file and link over to PubMed publications data or anywhere else in the LOD (Linked Open Data) cloud.  For those of you thinking "these commands are not easy nor obvious" (perhaps to the SemWeb junkies) you would be correct.  I'm exploring ways in which the commands can be executed visually via the 3D front-end interface, but, I needed a flexible foundation on which to build and the SPARQL-driven engine seemed the best way to achieve this.  As it is, several of the above commands could be re-written to be a bit more compact and fewer, but, I am learning about this stuff myself as I go along.  I'm getting better. ;-)

Next Steps
I've been focused on doing the semantic web/molecular visualization cross-over and now that I've hit that milestone, there is some front-end and back-end work that still needs to be done.  The data is there, but I am not currently displaying any of it in the actual visualization (RDF labels and such).  I would also like to enable  a user to interact with the model graphically.  Interaction now is limited to command-line SPARQL commands only.  I had tossed out the half-SPARQL, half my own concoction commands in favor of the SPARQL.

This year, I did a poster presentation of Nexus combined with work that I have done with my colleagues at Stony Brook University (Dr. Janos Hajagos and Tammy DiPrima) for CSHALS 2011 (see poster here).  In the poster, I mentioned a couple of other things I am working on.  One of them is another Nexus front-end client based on WebGL/HTML5.   I had started this last year, but shelved it while I redesigned the Nexus back-end (server) to be all-RDF that it is now.  Now that the server is working again I will get back to the WebGL/HTML5 client.  As part of that project, I wanted to experiment with using WebSockets rather that http calls between the WebGL client and Nexus.  I will also update the original Nexus client which I did in Second Life, but, it will not be able to render as large of displays as I can in OpenSimulator since Linden Labs limits region objects to 15,000 primitives.  The DNA force-directed model seen here is 26,713 primitives, nearly twice what the Second Life regions allow.  But, I have provisions to allow a limited client to see a smaller window of a larger model.  All three clients will use the same back-end server and will be able to view any of the server models at the same time.  For example, 30 avatars in an OpenSimulator region will be able to work with 30 avatars in a Second Life region along with 30 different WebGL/HTML5 clients at the same time and see changes done from any of the clients live.  RDF breaks down the walled gardens between worlds.



Nexus 3D RDF Visualization as an OpenSimulator Region Module Displaying Researcher Interest VIVO Data

The trouble with triples (not tribbles ;-), for me, is that there are alot of them. Last October, I ported my Nexus 3D RDF Visualizer into Opensimulator and was quite happy with the high availability of graphics primitives that I could use to display larger numbers of triples.  I started working with a set of 31,934 triples that represented the molecular structure of a strand of DNA but realized the programming model I was using wasn't going to scale as far as I wanted.

Nexus, to this point, existed as a massive number of coordinated scripted primitives that communicated to a back-end server that kept them all coordinated.  In my prior post, I was able to display 658 triples of FOAF data without any problems.  This 658 triples amounted to about 935 scripted graphics primitives (prims) and it worked and it was fast.  The front-end operated as a massive parallel processor but when the number of scripts (or in general terms, threads) increases without a corresponding increase in actual physical computation cores, the over-head of the separate threads becomes a liability.  In my case, I was looking at trying to run in excess of 40,000 scripted prims just in the case of the DNA RDF data set. *sighs heavily*  To solve this problem, I rewrote a new Nexus OpenSimulator front-end, not as a series of scripted prims, but as an actual Opensimulator region module.

Region modules are extensions of the core Opensimulator server software.  Opensimulator is written in C#, and being open-source, I was able to dig right in and excercise far greater control of Opensimulator operating at this level than when I was working with the easier, but more limited, scripted prims method.  The following images show a display of 20,002 triples (~25,000 prims - front&back with close ups) which represents about 534 individual SUNY Researchers and their research interests extracted from a VIVO installation that we are developing at Stony Brook (thank you Tammy DiPrima and Dr. Jizu Zhi who are part of that team).  The RDF data was then normalized by using the extracted MeSH terms from the researcher PubMed publications and then linked through a RDF representation of the UMLS (Unified Medical Language System) that was created by my collegue, Dr. Janos Hajagos. 

What is this normalization?  When I first tried visualizing our researcher interests from VIVO in Nexus, I found out that the research interests did not really link up and that I have 500+ little separate RDF graphs.  Why?  Because everyone had their own way of saying the same thing but slightly different.  We took the publication information we had for these researchers and linked it to a RDF version of PubMed that we developed at Stony Brook.  In this linkage, we extracted the MeSH terms (MeSH is part of the UMLS) and then linked and normalized them through the RDF UMLS.  Once this was done, things began to link up.  Multiple datasets linked are more interesting than a single data set. 

At the moment, the Nexus visualization of the data is more interesting to look at than useful.  Removal of the over-linked trivial data which obscures the more useful information needs to be done next.  Hover-text labeling of triples and data-sensitive clustering algorithms are also on the to-do (these features were present in the old front-end).  Fortunately, I did not have to change the back-end for the new front-end because it was my intentions from the beginning to have multiple front-ends connecting to the back-end(s).  Concurrently, I started last fall to develop an HTML5-based/WebGL front-end version of Nexus that would be able to see and share the same sessions as the OpenSimulator-based front-end with an extra twist of using WebSockets rather than http to pass RDF between the front-end and back-end.  Data persistence between sessions is handled thanks to OpenLink Virtuoso being tied to the back-end.  On a personal note, it's a lot of fun playing around with collaborative 3D Semantic Web visualization. :-)

Nexus Commands used:

color <0,1,0> p where {?s ?p ?o} color green all predicates (the sticks that represent the predicates)
color <1,0,0> s where {?s ?p ?o} color red all subjects
color <0,0,1> o where {?s ?p ?o} color blue all objects
color <1,1,1> o where {?s ?p ?o . filter(isliteral(?o))} color white all literals (this would over-write the blue of the last command on literals
shiny 3 spo where {?s ?p ?o} add metalic sheen for all triples



Subscribe to RDF