一场复杂的比赛

时间:2014-09-08 16:22:23

标签: neo4j cypher

我收到了以下密码查询:

neo4j-sh$ start n=node(1344) match (n)-[t:_HAS_TRANSLATION]-(p) return t,p;
+-----------------------------------------------------------------------------------+
| t                                   | p                                           |
+-----------------------------------------------------------------------------------+
| :_HAS_TRANSLATION[2224]{of:"value"} | Node[1349]{language:"hi-hi",text:"(>0@"}    |
| :_HAS_TRANSLATION[2223]{of:"value"} | Node[1348]{language:"es-es",text:"hembra"}  |
| :_HAS_TRANSLATION[2222]{of:"value"} | Node[1347]{language:"ru-ru",text:"65=A:89"} |
| :_HAS_TRANSLATION[2221]{of:"value"} | Node[1346]{language:"en-us",text:"female"}  |
| :_HAS_TRANSLATION[2220]{of:"value"} | Node[1345]{language:"it-it",text:"femmina"} |
+-----------------------------------------------------------------------------------+

和以下数组:     [“it-it”,“en-us”,“fr-fr”,“de-de”,“ru-ru”,“hi-hi”]

如何更改查询以仅返回一个结果,其中'language'与第一次出现的数组相同?

如果阵列应该是     [“fr-fr”,“jp-jp”,“en-us”,“it-it”,“de-de”,“ru-ru”,“hi-hi”]

我需要返回Node [1346],因为它是第一个在语言数组[en-us]中匹配的,没有[fr-fr]和[jp-jp]的条目

谢谢

1 个答案:

答案 0 :(得分:1)

Cypher可以表达数组,并为其编制索引。所以在一个层面上,你可以这样做:

start n=node(1344)
match (n)-[t:_HAS_TRANSLATION]-(p)         
where p.language = ["it-it", "en-us", "fr-fr", "de-de", "ru-ru", "hi-hi"][0] return t,p; 

这与请求p.language =" it-it" (数组中的第一个元素)。

现在,如果你的意思是language属性本身可以是一个数组,那就把它当成一个:

$ create (p { language: ['it-it', 'en-us']});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 1
$ match (p) where p.language[0] = 'it-it' return p;
+-------------------------------------+
| p                                   |
+-------------------------------------+
| Node[1]{language:["it-it","en-us"]} |
+-------------------------------------+
1 row
38 ms

请注意p.language[0]上的数组括号。

最后,如果您正在谈论的是将您的语言部分分成几部分(即" en-us" = [" en","我们&# 34;])然后cypher的字符串处理功能有点偏弱,我不会尝试这样做。相反,我首先在将其插入图表之前对其进行预处理,然后将它们作为单独的部分进行查询。

相关问题