如何在Neo4j数据库中的一个关系属性上写入带有条件的Cypher查询?

时间:2014-06-07 07:55:47

标签: neo4j cypher graph-databases

我的问题:

我是Neo4j的新手并尝试创建一个查询,将节点和关系列为关键字为“id = 0001”的图表,如下所示:

(a) - [id:'0001',ref_id:null] - > (b) - [id:'0002',ref_id:'0001'] - > (c) - [id:'0003',ref_id:'0002'] - > (d)

起始节点将是(a),因为它与id = 0001

有关系

但数据库也存在我不想要的关系:

(a) - [id:'2001',ref_id:null] - > (b) - [id:'2002',ref_id:'2001'] - > (c)中
(a) - [id:'3001',ref_id:null] - > (b) - [id:'3002',ref_id:'3001'] - > (c)中

结果应该只包括:

(a) - [0001] - (b) - [0002 0001] - (c) - [0003,0002] - (d)

以下是我在撰写问题之前的想法:

我知道如何在SQL数据库中创建此查询,如Oracle和MySQL,我可以使用查询“where”条件。例如:

Select * 
from table_a parent, (select * from table_a) child 
where child.ref_id = parent.id

然后我可以在Java中循环结果集来查找所有关系。但这是愚蠢的。

我认为查询应该如下:

Match (n)-[r:RELTYPE]->(m) WHERE {some conditions at here} RETURN n,r,m

请帮帮我,谢谢!

雨帆

2 个答案:

答案 0 :(得分:1)

您可以使用命名关系并在WHERE子句中进行过滤:

match p = (a)-[r1:TYPE]->(b)-[r2:TYPE2]->(c)
where r1.id='0001' and r2.id='0002' and r2.ref_id='0001'
return p

请注意,Neo4j中不允许使用具有空值的属性。所以第一个关系不会有ref_id

上述表示法是将条件放入match

的快捷方式
match p = (a)-[r1:TYPE {id:'0001'}]->(b)-[r2:TYPE2 {id:'0002', ref_id:'0001'}]->(c)
return p

旁注:我不确定您在关系属性中使用idref_id的方式是否是一种好方法建模您的数据。也许你可以使用更详细的关系类型 - 但是如果不了解域名,它就不可能在这里给出好的建议。

答案 1 :(得分:0)

我正在使用此Cypher查询来查找深度= 3的所有邻居。

MATCH (a)-[r1]-(b)-[r2]-(c)-[r3]-(n) 
WHERE n.APPLE_ID='12345' 
RETURN distinct n, distinct r3 

由于