编写动态Cypher查询 - Neo4j

时间:2014-01-26 01:04:01

标签: database graph neo4j cypher

我正在使用数据库neo4j开展Web项目。我希望用户根据所选标签选择标签(DB中的单独节点)并返回内容(也包括DB节点)。

我想根据他们已经选择的标签返回用户相关标签。

我想的查询看起来像这样:

        MATCH (tags:tag)-[:LINKED_WITH]-(content:content)-[:LINKED_WITH]-(previousTags:tag)
        WHERE 
                //new tags must be connected to content that already selected tags are connected to
                //for as many tags as the user has already selected
            (previousTags.UID = {ID1} OR previousTags.UID = {ID2} OR previousTags.UID = {ID3}) 
                //don't include tags that have already been selected in batch of new tags
                //for as many tags as the user has already selected
            AND NOT (tags.UID = {ID1} OR tags.UID = {ID2} OR tags.UID = {ID3}) 
        RETURN tags.whatever
        LIMIT 15
        ODER BY tags.number_of_connections

因为查询取决于用户已经选择的标签数量,所以我必须使用字符串构建来动态编写查询。

我有三个问题:

有没有办法在没有字符串构建的情况下完成此任务?

cypher / neo4j是否意味着处理这样的查询? (特别是如果用户已经选择了10-15个标签?)

有没有更好的方法来实现这一目标?

非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

请记住为tag.UID添加索引。

create constraint on (t:tag) assert t.UID is unique

您可以尝试使用previous.UID IN {selected_tags}并传递一个字符串数组/集合,但是afaik还不支持索引查找。 :(

所以现在你必须坚持建立弦乐。

java有cypher-dslneo4j.rb也支持ruby的cypher-dsl。这些可能对您有用,不确定它们是否支持您查询所需的全部内容。