【问题标题】:neo4j - Find all nodes with relationships to nodes that match a list of property values of x lengthneo4j - 查找与与 x 长度的属性值列表匹配的节点有关系的所有节点
【发布时间】:2015-11-25 21:39:29
【问题描述】:

更具体地说,我想做以下事情(如果有帮助,请使用 node/JS):

假设您有一个包含 3 个工作条件(“JavaScript”、“PHP”、“MySQL”)的列表。

我有一个图形设置,其中每个 Person 节点可以连接到许多 Skill 节点。我希望能够运行一个查询,该查询将返回所有Person 节点,这些节点至少连接到查询中指定的所有技能节点,然后按每个用户有多少积极连接进行排序。如果作业条件是一个变量,那么使该查询工作的最有效方法是什么?

这是我目前所拥有的。同样,这可行,但我如何使 OR 语句成为变量?

MATCH (n:Persons)-[r:KNOWS]-(x:Skill) WHERE x.name = 'PHP' OR x.name = 'JavaScript' OR x.name = 'MySql' RETURN DISTINCT n COUNT(n) ORDER BY COUNT(n) DESC

【问题讨论】:

    标签: javascript node.js neo4j


    【解决方案1】:

    您可以使用IN 运算符来测试值是否与列表中的值匹配。

    MATCH (n:Persons)-[:KNOWS]-(x:Skill)
    WHERE x.name IN ['PHP', 'JavaScript', 'MySql']
    RETURN n, COUNT(x) AS nSkills
    ORDER BY nSkills DESC;
    

    由于return子句使用COUNT()函数对aggregate超过n,所以使用DISTINCT n是多余的,所以查询省略了DISTINCT

    注意:为了提高效率,您应该将列表作为parameter 传递。例如,如果needed_skills 是一个包含技能列表的参数,则查询将如下所示:

    MATCH (n:Persons)-[:KNOWS]-(x:Skill)
    WHERE x.name IN {needed_skills}
    RETURN n, COUNT(x) AS nSkills
    ORDER BY nSkills DESC;
    

    (列表参数的Here is another example。)

    【讨论】:

      【解决方案2】:

      我不明白“使OR 语句成为变量”是什么意思,但是您可以使用ORDER BYCOUNT 实现另一部分

      MATCH (n:Persons)-[r:KNOWS]-(x:Skill)
      WHERE x.name = 'PHP' OR x.name = 'JavaScript' OR x.name = 'MySql'
      RETURN DISTINCT n, COUNT(r)
      ORDER BY COUNT(r) DESC
      

      您使用 count 来计数(n),所以它没有计算他们拥有的技能数量。完成计数后,您只需像以前一样订购即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多