Статьи

A Neo4j Challenge Вступление: Голосовая активация Символ биржи Поиск

 Содержание этого поста было написано в блоге Томаса Аугусто Мюллера, Code n ‘Roll.

Здравствуйте!

В этом посте я расскажу обо всех основных деталях, касающихся разработки моей заявки на Neo4j Challenge .

сайт вызова neo4j

Основная цель этой задачи — создать готовый Heroku шаблон или демонстрационное приложение с использованием Neo4j. Итак, я подумал про себя: — какое приложение было бы неплохо показать в этом конкурсе?

После многих идей, вот оно!

  логотип neoquotes

Короче говоря, приложение — это поиск символов на фондовой бирже с использованием Neo4j и вашего голоса.

Хорошо! Позвольте мне объяснить, что я сделал.

Моей главной целью было попытаться объединить всю радость программирования на Ruby с мощью и простотой использования, предоставляемыми потрясающими Spring Data Neo4j , Spring Framework и JVM, с этим удивительным программным обеспечением под названием Neo4j, которое с 2011 года дало мне любопытство. Джим Уэббер выступит на конференции QCONSP того года.

qconsp 2011

Итак, для начала JRuby идеально подходит. Это также позволило мне использовать Sinatra для простой разработки пользовательского интерфейса (как голосового интерфейса, так и GUI). В этом случае я выбираю Sinatra из-за его простоты, и пока приложение остается небольшим, оно побеждает Rails ( как говорит @DHH ).

Jetty — еще один очень хороший (и старый) проект, который предоставляет веб-сервер и контейнер javax.servlet, а также поддержку веб-сокетов, OSGi, JMX, JNDI, JASPI, AJP и многих других интеграций и может использоваться для разработки автономных Приложения. В этой статье из блога Heroku у нас есть хорошее введение в создание веб-приложения Java с использованием Jetty. Его интеграция с Maven также была еще одним мотивом.

Говоря о Maven, возможно, в POM.xml находится одна из самых хитрых частей приложения.

После настройки всех зависимостей, aspectj-maven-plugin, jetty-maven-plugin, давайте посмотрим на конфигурацию appassembler-maven-plugin и jruby-rake-plugin :

<executions>
    <execution>
        <id>install-bundler</id>
        <phase>process-resources</phase>
        <goals>
            <goal>jruby</goal>
        </goals>
        <configuration>
            <args>-S gem install bundler --no-ri --no-rdoc --install-dir vendor/bundle</args>
        </configuration>
    </execution>
    <execution>
        <id>bundle-install</id>
        <phase>process-resources</phase>
        <goals>
            <goal>jruby</goal>
        </goals>
        <configuration>
            <args>script/bundle install --without development:test</args>
        </configuration>
    </execution>
</executions>

As we can see, the plugin execution is responsible for download and install Bundler, then next execute the specified script witch lives in application script folder. This script basically starts Bundler client (pre-configuring ENV[‘GEM_HOME’], ENV[‘GEM_PATH’] and ENV[‘BUNDLE_GEMFILE’]), and following the parameters, all gems except the ones for development and test, are installed.

Last, but not least, the appassembler-maven-plugin:

<configuration>
    <assembleDirectory>target</assembleDirectory>
    <extraJvmArguments>-Djruby.native.enabled=false -Djruby.cext.enabled=false -Djruby.compat.version=1.9 -Xmx256m -Xss2048k</extraJvmArguments>
    <programs>
        <program>
            <mainClass>org.jruby.Main</mainClass>
            <name>jruby</name>
        </program>
    </programs>
</configuration>

 

Above we have the configuration for the assemble goal execution. The trick here is to generate the executable with JRuby (org.jruby.Main) as main class. And you can also set extra JVM arguments, like the version of Ruby language to use.

After this brief look into POM.xml, let’s see how Heroku starts Jetty. This is defined in the Procfile:

web: sh target/bin/jruby -S config/jetty.rb

So, that’s it! Now our app is running on Heroku Cloud! For more details take a look into /config/jetty.rb to see how Jetty is being started up and /src/main/webapp/WEB-INF/web.xml to see the JRuby-Rack configuration. Other technical details you can find at application readme file.

Now, let’s talk about Neo4j.

Your life is a huge graph.

(…) and I think it can be handled by Neo4j. Back to 2011, Jim Webber let me very

Хорошо ... не совсем график.  Но ты получил идею!

Ok… not quite a graph. But you get the idea!

interested in Neo4j with his talk at QCONSP 2011. Maybe because in that year I was working on my final graduation project – a recommender system to support fundamental analysis of the Stock Market using natural language processing, and I never forgot of one thing that he said. More or less like this: “MapReduce processing between http requests can be very expensive! Some problems cannot be resolved with this approach.”. Well, I did this. And I must confess: a graph database would have changed a lot my project.

So, when I discovered this challenge, I decided “- ok, now is the time to take a closer look on Neo4j.”

First thing I did: accessed Neo4j download page and downloaded the 1.6 Community version.

After that, the server installation. It is super easy. Just follow this instructions.

So, what’s next step? Learn, learn and learn!

I was able to make some initial experiments very fast after a dynamic reading of this *superb* online resource: Good Relationships: The Spring Data Neo4j Guide Book. Thank’s to Michael Hunger, David Montag, Andreas Kollegger by this material.

Also, I learned a lot from the following links:

And that’s it. This is the magic of open-source software. Have a doubt of how one given thing work? Go to source code and read it! All you need to get started with Neo4j is this. Trust me ; )

Giving voice to a graph

I used Arbor.js library to display the Neo4j data to the user. But how differently the information can be visualized? Through voice interfaces of course!

As I already worked with Voice Interfaces some years ago (in 2008 actually, when I won the Sun Students Contest. More info here and here), this was not a mystery. Again I used VoiceXML markup language, and the free service provided by Voxeo. Refer to the links above for more information about VoiceXML.

Sinatra eased this part even more, through it’s easiness of building API’s like applications. All vxml interfaces and grammars are bellow /app/views/voice folder, and there are only two voice routes in application.rb.

To use the Voxeo service, is simple. You only need to create an account, and after that, set up a new application through Voxeo Application Manager, informing the voice entry point of your application (the full URL to your route. In my case to the get ‘/voice/index.vxml’ route).

Note that your application need to be accessible by Voxeo server. So don’t forget to git push heroku master, before setting up your app on Voxeo.

Finishing, you’ll get the numbers to your application. I always tested with Skype VoIP number. Works very well here in Brazil and is totally free.

You can try calling to NeoQuotes! This is the Skype VoIP number: +990009369996189207 (to see all available numbers for NeoQuotes access the application and click on the respective top nav bar link).

Important: When you spell the stock symbol, say one letter, and wait the voice repeat what you just said. And go on. When you finish, you can say “Okay!”, “Go!” or “Search!” for example. If your desired symbol have an ‘.‘ you have to say “dot”. The voice will not repeat this (will stay in silence). Just continue with the letters or numbers.

Summing up

This demo application contains an interesting stack of technologies, providing an environment to develop robust and testable Neo4j applications, with a lot of fun. Certainly much more can be done and improved. And you can help filling issues and submitting pull requests!

Please, help voting in this application at Gensen repository or help with a Tweet!

Thank you Neo4j for running this challenge! It was very fun to participate.

Source: http://tomasmuller.com.br/2012/02/13/talking-with-neo4j-graphs/