Neo4j Cypher递归查询
我有一个Cypher查询,它返回两个Neo4j Cypher递归查询,neo4j,cypher,Neo4j,Cypher,我有一个Cypher查询,它返回两个标记节点之间的标记同义词节点: MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) WHERE t.id = {tagId} AND s.id = {synonymId} RETURN ts 而ss可以有自己的TagSynonym等等 这个结构的深度可能相当大 请帮助我扩展此查询,以便返回在t:Tag上建立的所有TagSynonym及其所有同义词后继项(用于s:Tag的标记,并更深入到此
标记
节点之间的标记同义词
节点:
MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag)
WHERE t.id = {tagId} AND s.id = {synonymId}
RETURN ts
而ss
可以有自己的TagSynonym
等等
这个结构的深度可能相当大
请帮助我扩展此查询,以便返回在
t:Tag
上建立的所有TagSynonym
及其所有同义词后继项(用于s:Tag
的标记,并更深入到此递归结构的末尾。)类似的内容看起来是否朝着正确的方向发展
基本上使用apoc.path.expandConfig
从s
开始,并开始抓取新的TagSynonym
和Tag
节点
MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag)
WHERE t.id = {tagId} AND s.id = {synonymId}
WITH t, ts, s
CALL apoc.path.expandConfig(s
{
uniqueness:"NODE_GLOBAL",
labelFilter:"TagSynonym|Tag",
relationshipFilter: '<FOR|HAS>'
}) YIELD path
RETURN t, ts, s, path
匹配(t:Tag)(s:Tag)
其中t.id={tagId}和s.id={synonymId}
用t,ts,s
调用apoc.path.expandConfig
{
唯一性:“节点\全局”,
标签过滤器:“标记同义词|标记”,
relationshipFilter:“”
})屈服路径
返回t,ts,s,路径
可选地,如果不使用AOC库来实现类似的事情,则可以考虑沿着这个查询的一些东西…
MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag)
WHERE t.id = {tagId} AND s.id = {synonymId}
WITH t,ts,s
OPTIONAL MATCH p=(s)-[:FOR|HAS*]-(end:Tag)
WHERE NOT (end)<-[:FOR]-()
RETURN p
匹配(t:Tag)(s:Tag)
其中t.id={tagId}和s.id={synonymId}
用t,ts,s
可选匹配p=(s)-[:FOR | HAS*]-(end:Tag)
(完)谢谢你的回答。我很抱歉,但是没有apoc是否可以实施?我以前尝试过安装apoc,但失败了(特别是在基于嵌入式Neo4j的测试中),并且在我的应用程序中使用了纯密码查询。我添加了一个非apoc查询,可能适合您。我不确定它将如何处理您的数据。还要注意路径扩展中的裸*
;它可能很快失去控制,这取决于标记
和标记同义词
节点之间的复杂关联程度。
MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag)
WHERE t.id = {tagId} AND s.id = {synonymId}
WITH t,ts,s
OPTIONAL MATCH p=(s)-[:FOR|HAS*]-(end:Tag)
WHERE NOT (end)<-[:FOR]-()
RETURN p