Head's Up! These forums are read-only. All users and content have migrated. Please join us at community.neo4j.com.
10-22-2021 08:31 AM
Hi guys!
I'am looking for a solution.
Here's the graph
create (n:Node{id:1,closed:false})
create (n)-[:PARENT]->(n1:Node{id:2, closed:true})-[:CHILD]->(n)
create (n1)-[:PARENT]->(n2:Node{id:3, closed:false})-[:CHILD]->(n1)
create (n2)-[:PARENT]->(n3:Node{id:4, closed:true})-[:CHILD]->(n2)
create (n3)-[:PARENT]->(n4:Node{id:5, closed:false})-[:CHILD]->(n3)
create (n4)-[:PARENT]->(n5:Node{id:6, closed:false})-[:CHILD]->(n4)
closed = true
I came up with this query, it works for me but I feel that there is better solution for this because I don't need to scan all the nodes above. LIMIT not works here, because I want to change this node after I find it inside the transaction.
I don't know how much nodes above with closed = false.
match v=(p:Node{id:6})-[:CHILD*]->(:Node{closed:true})
with nodes(v) as nodes
UNWIND nodes AS node
with node where node.closed = true
with collect(node)[0] as first
return first
Thanks for your help!
10-22-2021 09:12 AM
I swear i'll stop answering if you don't fix your model
So, I have a bad news for you.You can't avoid this overhead of search with plain cypher. If you really have strong stop/go conditions on that property. Do this:
//CREATING MODEL WITHOUT CHILD
create (n:Node{id:1,closed:false})
create (n)-[:PARENT]->(n1:Node{id:2, closed:true})
create (n1)-[:PARENT]->(n2:Node{id:3, closed:false})
create (n2)-[:PARENT]->(n3:Node{id:4, closed:true})
create (n3)-[:PARENT]->(n4:Node{id:5, closed:false})
create (n4)-[:PARENT]->(n5:Node{id:6, closed:false})
//ADDING MAGIC TAG
MATCH (n:Node)
where n.closed = true
Set n:CLOSED
//THEN QUERY WITH SWAG
match (p:Node{id:6})
CALL apoc.path.expandConfig(p, {
relationshipFilter: "<PARENT",
labelFilter: "/CLOSED"
})
yield path
return last(nodes(path))
Bennu
PS: Welcome to Wonderland
10-22-2021 12:07 PM
Well, i thought that it's possible. You mean I should add additional information in the node to make traversal easier.
Thanks for helping me. I will check out other solutions but i thought that for group tree this model of data will be enough
10-22-2021 12:34 PM
Hi!
Your query is fine, it's just that in a big graph will start giving poor performance. Data Modeling and Performance strongly connected on GraphDbs. Normal queries with Cypher will collect all that data and then apply the filter you are requesting.
As you noticed, in your use case, you may end traversing much more paths hat you really need. APOC path procedures will help you with that, but, their logic is Label/Relationships centric. Don't be afraid of adding labels or differ t relations to your model if needed.
Bennu
08-25-2022 12:02 AM - edited 08-25-2022 10:37 AM
I created a separat post for that: https://community.neo4j.com/t5/neo4j-graph-platform/getting-nearest-neighbours-with-the-same-value-o...
All the sessions of the conference are now available online