繁体   English   中英

编写动态密码查询-Neo4j

[英]Writing a Dynamic Cypher Query - Neo4j

我正在使用数据库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个标签?)

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

任何见解将不胜感激。

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

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

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

因此,现在您必须坚持字符串构建。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM