MATCH查询中的Neo4J数组

时间:2014-04-19 05:16:11

标签: ruby-on-rails neo4j neography

我的查询的目的是标记相似的单词。

CREATE CONSTRAINT ON (n:Word) ASSERT n.title IS UNIQUE

MATCH (n) WHERE ID(n)={id} 
MERGE (o:Word{title:{title}}) 
WITH n,o MERGE n-[r:SIMILAR{location:'{location}'}]->o 
RETURN ID(o)

n是现有的Word。我想创建关系和关系另一个Word(o)如果它们还不存在。

此查询的问题是,它适用于一个标题,但如果我使用带标题的数组,那么Word o的标题就是整个数组。

你能否建议我使用另一个查询来执行相同的操作和/或将多个值传递给title的方法。

我在Rails上使用Neography Gem,例如REST API

1 个答案:

答案 0 :(得分:1)

要在参数数组中使用单个值,您可以使用FOREACH,例如

MATCH (n)
WHERE ID (n) = {id}
FOREACH (t IN {title} |
    MERGE (o:Word {title:t})
    MERGE n-[:SIMILAR]->o
)

如果您还希望将location作为参数传递(它实际上是当前查询中的字符串文字),那么n的合并操作应该针对每个title, location对进行在参数数组中,您可以尝试

FOREACH (map IN {maps} |
    MERGE (o:Word {title:map.title})
    MERGE n-[:SIMILAR {location:map.location}]->o
)

带有类似

的参数
{
    "maps": [
        {
            "title":"neography",
            "location":"1.."
        },{
            "title":"coreography",
            "location":"3.."
        }
    ]
}

其他建议:

  1. 通过参数内部id查找节点通常不太好。在某些情况下,链接查询时可能没问题,但在大多数情况下,标签索引查找会更好:MATCH (n:Word {title:"geography"})
  2. 如果您没有使用事务性密码端点,请试一试。然后,您可以在一个事务中的每个调用中使用一个或多个查询进行一个或多个调用。性能提高,您可能会发现您不需要发送更复杂的参数对象,但可以发送许多简单的查询。