如何在Neo4j数据库中的一个关系属性上编写带条件的密码查询? 我的问题:

如何在Neo4j数据库中的一个关系属性上编写带条件的密码查询? 我的问题:,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我是Neo4j新手,尝试创建一个查询,将节点和关系列表到一个关键字为“id=0001”的图中,如下所示: (a)-[id:'0001',ref\u id:null]->(b)-[id:'0002',ref\u id:'0001']->(c)-[id:'0003',ref\u id:'0002']->(d) 起始节点将是(a),因为它与id=0001有关系 但数据库也存在我不想要的关系: (a)-[id:'2001',ref\u id:null]->(b)-[id:'2002',ref\u id:

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

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

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

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

(a)-[id:'2001',ref\u id:null]->(b)-[id:'2002',ref\u id:'2001']->(c)
(a) -[id:'3001',参考id:null]->(b)-[id:'3002',参考id:'3001']->(c)

结果应仅包括:

(a) -[0001]-(b)-[000220001]-(c)-[00030002]-(d)

以下是我在写问题之前的想法: 我知道如何在像Oracle和MySQL这样的SQL数据库中创建这个查询,我可以使用带有“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
请帮帮我,谢谢


Yufan

您可以在
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中不允许具有null值的属性。因此,第一个关系不会有
ref\u id

因为上面的符号是一种快捷方式,它将条件放入
匹配项中

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

另一方面:我不确定在关系属性中使用
id
ref\u id
的方式是否是对数据建模的好方法。也许您可以使用更详细的关系类型-但是如果不了解域,就不可能在此处给出好的建议。

我使用此密码查询查找深度为3的所有邻居

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

谢谢

嗨,Stefan,谢谢你的帮助。是否可以仅通过输入r1.id='0001'查找所有相关对象?我的模型有“用户”和“消息”,我需要将所有用户的消息链接在一起,所以我将消息放在关系中,将用户放在节点中,有没有更好的方法来建模这种关系?因为消息是具有标识的东西,所以您应该将它们建模为节点,并通过发件人和收件人之间的“发件人”和“收件人”关系将它们连接起来。如果将消息建模为节点,则它们是可引用的,因此两条消息可以具有回复关系。与在关系上使用id引用相比,这种建模更为“图形化”。抓起一份pdf副本并通读一遍。嗨,Stefan,再次感谢你非常有用的回复。我决定用Java循环结果集中的所有消息。我没有将消息作为节点放置是有原因的。因为在同一个图形数据库中会有不同类型的节点,所以不会有从用户到另一个用户的直接关系(它将有新的关系,比如用户到消息节点到另一个用户)。