【问题标题】:Writing a Dynamic Cypher Query - Neo4j编写动态密码查询 - Neo4j
【发布时间】:2014-01-26 01:04:00
【问题描述】:

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

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

我正在考虑的查询如下所示:

        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 个标签?)

有没有更好的方法来做到这一点?

任何见解都将不胜感激。

【问题讨论】:

  • 那么你选择了什么样的路径来形成这些动态标签?另外,如果我们必须使用动态路径动态形成遍历查询怎么办?

标签: database graph neo4j cypher


【解决方案1】:

记得为tag.UID添加索引。

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

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

所以现在你必须坚持构建字符串。

cypher-dsl 用于 java,neo4j.rb 也支持 cypher-dsl 用于 ruby​​。这些可能对您有用,但不确定它们是否支持您查询所需的一切。

【讨论】:

  • 感谢迈克尔的回答。您和 neo4j 团队的其他成员都在做着出色的工作,我非常尊重您对社区的参与。
猜你喜欢
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多