如果属性数大于n,则返回Neo4j中的路径
我有一个图形数据库,看起来像这样: 唯一有趣的是,如果属性数大于n,则返回Neo4j中的路径,neo4j,cypher,Neo4j,Cypher,我有一个图形数据库,看起来像这样: 唯一有趣的是,SomeProperty可以是“是”或“否” 在顶行中,3个节点中的1个对此属性具有“是” 在最下面一行,所有3个节点对此属性都有一个“是” 我如何编写一个只返回最下面一行的密码查询,通过询问以下问题:哪个子图对于SomeProperty='Yes'有2个或更多的值 这是我的密码: CREATE (person:Person {gender: 'Male', name: 'Albert', SomeProperty: 'Yes'}) CREAT
SomeProperty
可以是“是”或“否”
在顶行中,3个节点中的1个对此属性具有“是”
在最下面一行,所有3个节点对此属性都有一个“是”
我如何编写一个只返回最下面一行的密码查询,通过询问以下问题:哪个子图对于SomeProperty
='Yes'有2个或更多的值
这是我的密码:
CREATE (person:Person {gender: 'Male', name: 'Albert', SomeProperty: 'Yes'})
CREATE (person:Person {gender: 'Female', name: 'Annie', SomeProperty: 'Yes'})
CREATE (person:Person {gender: 'Female', name: 'Adrian', SomeProperty: 'No'})
MATCH (a1:Person),(a2:Person)
WHERE a1.name = 'Albert' AND a2.name = 'Annie'
CREATE (a1)-[r:RELATED_TO]->(a2)
SET r.relationship='related'
MATCH (a1:Person),(a2:Person)
WHERE a1.name = 'Annie' AND a2.name = 'Adrian'
CREATE (a1)-[r:RELATED_TO]->(a2)
SET r.relationship='related'
CREATE (person:Person {gender: 'Male', name: 'Bill', SomeProperty: 'Yes'})
CREATE (person:Person {gender: 'Female', name: 'Barb', SomeProperty: 'Yes'})
CREATE (person:Person {gender: 'Male', name: 'Barry', SomeProperty: 'Yes'})
MATCH (a1:Person),(a2:Person)
WHERE a1.name = 'Bill' AND a2.name = 'Barb'
CREATE (a1)-[r:RELATED_TO]->(a2)
SET r.relationship='related'
MATCH (a1:Person),(a2:Person)
WHERE a1.name = 'Barb' AND a2.name = 'Barry'
CREATE (a1)-[r:RELATED_TO]->(a2)
SET r.relationship='related'
我想我有点困惑,因为我不确定一条链可以有多长,如果它总是只有三条,那么我想像这样的东西可能会返回它们
MATCH (p1)-[r1]-(p2)-[r2]-(p3)
WHERE (a1.SomeProperty ='Yes' AND a2.SomeProperty ='Yes')
OR (a1.SomeProperty ='Yes' AND a3.SomeProperty ='Yes')
RETURN a1,a2,a3
如果可以再长一点的话,也许可以开始寻找这两个节点
MATCH (a1)-[..]-(a2)
WHERE (a1.SomeProperty ='Yes' AND a2.SomeProperty ='Yes')
RETURN a1,a2
然后从这些节点开始提取子图,如下所示:
当然,我还没有玩过那么多Neo4J,所以我相信会有人过来给我一个更好的提示,返回所有包含2个以上“Yes”节点的路径:
MATCH p=(:Person)-[:RELATED_TO*]->(:Person)
WHERE 2 < REDUCE(s = 0, x IN NODES(p) | CASE WHEN x. SomeProperty = 'Yes' THEN s + 1 ELSE s END)
RETURN p;
MATCH p=(:Person)-[:RELATED_TO*]->(:Person)
其中2
REDUCE
函数用于计算SomeProperty
值为“Yes”的节点数。它返回路径p
中的节点集合。这真是太神奇了——我从来不会使用REDUCE
,主要是因为我不知道它的存在!如果我问你:如果图中存在路径,我怎么可能返回整个图而不仅仅是路径?你说的“整个图”是什么意思?您的意思是希望结果不显示子路径吗?是的!似乎还有100多个节点以“B”开头作为上述示例的扩展:如果100个节点中有2个或更多节点满足SomeProperty
,我想显示所有100个节点。也许我应该问另外一个问题?@cybersam:好的……我问了一个新问题:D