【问题标题】:Neo4j - Iterate for common nodes for a given list of nodesNeo4j - 迭代给定节点列表的公共节点
【发布时间】:2015-11-05 12:22:48
【问题描述】:

我不知道在 neo4j 中迭代列表。请有人提出以下问题的想法。

示例: 我在图中有一些节点。 然后,我将给出几个(总是变化的,这是用户输入的)关键字来搜索这些词共有的节点。在我的图中,每个单词都是一个节点。

Ex: Input: [Best sports car]
output: connected nodes for Best are [samsung,porshe,ambassdor,protein,puma]
        connected nodes for sports are [cricket,racing,rugby,puma,porshe]
        connected nodes for car are [porshe,ambassdor,benz,audi]
Common nodes to all words are : [porshe]
Result is : porshe

我不知道迭代每个单词并存储匹配结果。请有人提出任何想法。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    为了测试以下工作查询,我将做一些假设:

    • 单词节点具有标签:Wordname 属性。
    • porsche、puma 等节点具有标签:Itemname property
    • Item 节点与Word 节点有一个传出的CONNECT 关系

    这将给出以下图表:

    查询如下(为了模拟给定的单词作为参数,我在查询的开头添加了一个包含单词列表的 WITH)

    WITH ["car","best","sports"] as words
    MATCH (n:Word)<-[:CONNECT]-(i:Item) 
    WHERE n.name IN words
    WITH i, count(*) as c, words
    WHERE c = size(words)
    RETURN i
    

    并且将只返回porsche Item 节点。

    逻辑解释

    查询的逻辑是如果一个节点匹配所有给定的单词,在第一个MATCH中会找到3个模式,所以count(*) 在此处对于 porsche 节点的值为 3。 该值与words 列表中的size 进行比较。

    更多解释

    WITH 语句中,有两个表达式:icount(*)

    i 不是聚合函数,因此它将充当分组键。 count(*) 是一个聚合函数,将在 i 存储桶上运行,计算聚合值。

    例如,如果您想知道每个 Item 匹配了多少个单词,您可以简单地这样做:

    WITH ["car","best","sports"] as words
    MATCH (n:Word)<-[:CONNECT]-(i:Item) WHERE n.name IN words
    RETURN i.name, count(*)
    

    这将返回:

    您可以看到porsche 匹配了3 个单词,即给定words 列表的size,然后您可以简单地将计数aggregation 中的3 与此size 进行比较。

    为了全面了解聚合的工作原理,您可以参考手册:http://neo4j.com/docs/stable/query-aggregation.html

    您可以在这里测试查询:

    http://console.neo4j.org/r/e6bee0

    如果您将单词作为参数传递,这将是相应的查询:

    MATCH (n:Word)<-[:CONNECT]-(i:Item) 
    WHERE n.name IN {words}
    WITH i, count(*) as c
    WHERE c = size({words})
    RETURN i
    

    假设 {words} 是给定查询参数的名称

    【讨论】:

    • 这有点难以理解。能否请您详细说明查询。
    【解决方案2】:

    你追求的是这样的东西吗?

    从请求搜索的单词集合开始。

    将每个单词与图表匹配。

    在列表中收集连接的单词。

    with ['Best', 'sports', 'car'] as word_coll
    unwind word_coll as word
    match (:Word {name: word})--(conn_word:Word)
    return word,collect(conn_word)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多