Neo4j Cypher查询和复合对象

时间:2017-07-08 16:44:10

标签: neo4j cypher

我有一个以下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 2Tag 1的同义词,Tag 3Tag 2的同义词。

我需要通过Decision及其同义词(Tag 1Tag 2)找到所有Tag 3。这是决定:Decision1Decision2Decision 3

1 个答案:

答案 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决定