2014-10-02 22 views
1

我想写一个密码查询,它允许您传入一组名称作为字符串来查找匹配的节点,然后返回每个节点的ID。我一直在玩弄语言和具有以下缺陷查询上来:如何查找节点的子集并在密码中返回它们的ID?

START person=node(*) 
WHERE HAS (person.name) 
WITH FILTER (name IN ['ryan','mike'] : person.name=name) AS matchedPersons 
RETURN ID(matchedPersons) 

Expected `matchedPersons` to be a node or relationship, but it was `` 

如果我回到matchedPersons而不是ID(matchedPersons),我得到这样的结果:

+------------------------------------------+ 
| matchedPersons       | 
+------------------------------------------+ 
| ["ryan"] | 
| ["mike"] | 
| []          | 
+------------------------------------------+ 
3 rows 

在我的数据库,我有三个人名有'ryan','mike'和'lucy'的节点。我想获取与FILTER子句中定义的集合中的名称匹配的人员的ID。我怎样才能得到每个姓名至少与集合中的一个姓名相匹配的人的ID?

回答

2

有一个更简单的写这个查询方式:

neo4j-sh (?)$ match (p:Person) where p.name in ['ryan', 'mike'] return id(p); 
+-------+ 
| id(p) | 
+-------+ 
| 14680 | 
| 14681 | 
+-------+ 
2 rows 
96 ms 

(测试一些地方的数据,所以你的ID将有所不同)。好的,这就是如何做到这一点。但是,这是事情 - 你可能不应该看,处理或关心单个节点的ID。 See this related question。节点ID应该被认为是一个实现细节。他们会为你提供的唯一标识符,但你应该对他们的价值做出零假设。不要假设他们永远不会改变,或者他们总是以某种方式订购。如果你需要一个具有实际意义的标识符,请使用你自己的。

+0

有趣的阅读,但是我得到的ID使用Neo4JTemplate类建立关系。该类中的创建关系方法调用节点ID。 – 2014-10-02 13:38:53

+1

不熟悉该课程或您想要在那里做什么。我所能建议的是,如果有一种替代方法处理“Node”对象而不是ID,那可能会更好,这样您可以让其他人担心ID的详细信息。我尽量不要惹他们,因为10次中有9次他们不是你想要的。你可能有一个例外,虽然因为你如何使用它们,我不确定。 – FrobberOfBits 2014-10-02 13:49:59

+1

这些是节点的id,你可以使用'template.query()'方法,这个查询用一个命名参数替换集合并返回p,那么你有你的节点'template.query(“match(p :Person)在{names}中的p.name返回p“,map(”names“,asList(”ryan“,”mike“)))。(Node.class);' – 2014-10-02 21:18:41

相关问题