2015-10-08 1 views
2

Utilisation de Neo4j dans une application Rails.Comment effectuer une recherche générale sur les propriétés de chaîne dans mes nœuds?

J'ai des nœuds avec plusieurs propriétés de chaîne contenant de longues chaînes de contenu généré par l'utilisateur. Par exemple dans mes nœuds de type: "Livre", je pourrais avoir des propriétés, "review", et "summary", qui contiendraient des valeurs de chaîne de forme longue.

J'essayais de concevoir des requêtes qui renvoyaient des nœuds correspondant à ces propriétés aux termes généraux de recherche de langue fournis par un utilisateur dans une boîte de recherche. Comme ma requête devenait de plus en plus compliquée, il m'est apparu que j'essayais de résoudre la recherche en langage naturel. J'ai regardé quelques-unes des gemmes de recherche populaires dans Rails, mais elles semblent toutes dépendre d'ActiveRecord. Quelles solutions de recherche existent pour Neo4j.rb?

Répondre

0

Je ne sais pas si quelque chose de spécifique existe pour neo4j.rb et activerecord. Ce que je peux dire est que généralement ce genre de choses est géré par l'utilisation de legacy indexes that are implemented by Lucene. La prémisse est que vous créez un index géré par Lucene sur certaines propriétés, ce qui vous permet d'utiliser le langage de requête Lucene via cypher pour obtenir des données à partir de ces index. Par rapport à neo4j.rb, it doesn't look any different than running cypher queries, comme ceci:

START item=node:node_auto_index("(title:'foo bar' AND body:baz*) OR title:'bat'") 
RETURN item 

Notez que les index de Lucene et que le langage de requête ne peut être utilisé dans un bloc START, pas un bloc MATCH. Reportez-vous au Lucene Query Syntax pour en savoir plus sur ce que vous pouvez faire avec cette syntaxe de requête (correspondance floue, caractères génériques, etc. - un peu plus étendue que ce que regex vous donnerait).

+0

Malheureusement, neo4j.rb ne supporte pas les index hérités (nous recommandons généralement d'utiliser searchSearch pour utiliser elasticsearch –

2

Il y a plusieurs façons de procéder! Comme l'a dit FrobberOfBits, Neo4j possède ce qu'on appelle des «index hérités» qui utilisent Lucene comme arrière-plan pour fournir l'indexation de choses génériques. Il prend en charge les nouveaux index de schéma. Malheureusement, ceux-ci sont basés sur des correspondances exactes (même si je suis assez sûr que cela va changer quelque peu dans Neo4j 2.3.x).

Neo4j prend en charge la correspondance de modèle sur les chaînes via l'opérateur =~, mais ces requêtes ne sont pas indexées. La performance dépend donc de la taille de votre base de données.

Nous vous recommandons souvent une gemme appelée searchkick qui vous permet de définir des index pour Elasticsearch dans vos modèles. Ensuite, vous pouvez simplement appeler une méthode Model.search pour faire vos recherches et il va d'abord interroger elasticsearch pour obtenir les ID de nœud, puis charger ces nœuds via Neo4j.rb. Vous pouvez l'utiliser via le neo4j-searchkick bijou: https://github.com/neo4jrb/neo4j-searchkick

Enfin, si vous faites la PNL et essayez d'extraire des mots importants de votre texte, vous pouvez créer une étiquette Tag/Word et créer des relations de vos nœuds à ces PNL nœuds extraits afin que vous puissiez effectuer une recherche basée sur ces nœuds dans le futur. Vous pouvez même créer des recommandations d'un nœud de texte à un autre en fonction du nombre/type de nœuds de points communs.

+0

Si vous avez d'autres questions, n'hésitez pas à poser des questions sur le groupe Neo4j: http://neo4j.com/blog/public-neo4j-users-slack-group / –