我有一个以下Cypher查询,它返回属于特定Decision
的所有Tag
:
MATCH (d:Decision)-[:BELONGS_TO]->(t:Tag) WHERE t.id = {tagId} RETURN d
根据我的业务逻辑,每个Tag
都可以有一组同义词:
(t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag)
并且每个s:Tag
也可以以相同的方式关联同义词..无限深度和ts.approved = true
。
是否可以展示如何扩展第一个查询,以便不仅返回与开始标记(t.id = {tagId}
)相关联的决策,还返回与所有标记的同义词相关的所有决策(无限深度) 。
理想情况下,所有这些决定都应在一个d
变量下返回。
现在我正在使用以下查询:
MATCH p=(t:Tag)-[:FOR|HAS*]-(end:Tag)
WHERE t.id = {tagId} AND NOT (end)<-[:FOR]-()
OPTIONAL MATCH (d:Decision)-[:BELONGS_TO]->(tag)
RETURN d
但它没有用。
已更新
我创建了一个Neo4j沙箱:
http://54.165.53.29:33761/browser/
neo4j
timer-rocks-hilltop
请使用以下查询:
MATCH p=(t:Tag)-[:FOR|HAS*0..]-(end:Tag)
WHERE t.id = 1 AND NOT (end)<-[:FOR]-()
MATCH (d:Decision)-[:BELONGS_TO]->(end)
RETURN d
它只返回路径中的最后一个决策(Decision3),但也应该返回Decision1和决策2。
这是sample database用户名/密码:neo4j / neo4j1
我有3 Tag
和3 Decision
与此标记相关联。
另外
Tag 2
是Tag 1
的同义词,Tag 3
是Tag 2
的同义词。
我需要通过Decision
及其同义词(Tag 1
和Tag 2
)找到所有Tag 3
。这是决定:Decision1
,Decision2
,Decision 3
答案 0 :(得分:3)
有一个微妙的东西,可变深度遍历是零深度:
MATCH p=(t:Tag)-[:FOR|HAS*0..]-(end:Tag)
WHERE t.id = {tagId} AND NOT (end)<-[:FOR]-()
MATCH (d:Decision)-[:BELONGS_TO]->(end)
RETURN d
这个想法是,它处理t个节点具有FOR或HAS关系的情况以及何时不具有FOR或HAS关系的情况。诀窍是找到的标签(甚至t节点因此为0)都在end
别名之下。
您可以在本文中找到有关变长关系的更深入的文档:https://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.html
修改强>
找到标记节点的逻辑似乎是错误的,由于查询AND NOT (end)<-[:FOR]-()
中的这一部分,查询只返回一个标记。删除它,你会看到它返回3决定