我是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
请帮帮我,谢谢!
雨帆
答案 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
旁注:我不确定您在关系属性中使用id
和ref_id
的方式是否是一种好方法建模您的数据。也许你可以使用更详细的关系类型 - 但是如果不了解域名,它就不可能在这里给出好的建议。
答案 1 :(得分:0)
我正在使用此Cypher查询来查找深度= 3的所有邻居。
MATCH (a)-[r1]-(b)-[r2]-(c)-[r3]-(n)
WHERE n.APPLE_ID='12345'
RETURN distinct n, distinct r3
由于