Re: [Neo4j] Gremlin Query - Help
Marko, I am thinking of using this statement. g.V.ifThenElse{it.out('hasCentre').filter{it == aCentre}.hasNext()}{}{println ${it} has center unknown} to get nodes that DO NOT have a relationship, is this the best way to do it? I guess so, if this is the case, I am now adding support to the .NET graph client to support ifThenElse expressions. I am wondering though, as I am designing the interface for it, can and ifThenElse have nested ifThenElse expressions as well? I guess it and _() can be used within them? Cheers -Original Message- From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org] On Behalf Of Marko Rodriguez Sent: Saturday, 3 December 2011 4:10 AM To: Neo4j user discussions Subject: Re: [Neo4j] Gremlin Query - Help Hi, Scenario 1: I would like to get all Nodes that do not have a relationship to another node. What is the best way to do this Gremlin? Root = NodeA = NodeB Root = NodeC Output should be NodeC I don't understand the problem. Scenario 2: Root = User - Centre I would like to get all centres for userA, and then get all users who are also linked to the same centres of the userA userA.out('hasCentre').in('hasCentre').except([userA]) Scenario 3: User = Centre I would like to get all users that do not have a link to a Centre, and if this is the case, do a projection that returns a fake centre with property Unknown g.V.ifThenElse{it.out('hasCentre').filter{it == aCentre}.hasNext()}{}{println ${it} has center unknown} If you have an index of your Users, then its more efficient to hit that index, then iterate through all vertices (g.V). E.g. g.idx(T.v)[[type:'User']].ifThenElse Scenario 4: REFERRAL = PERSON I would like to combine a query that gets all Referrals that are linked to a person and project a table result (contains referrals and person property values (this is easy to do) However, I then want to do a SPLIT query, that gets referrals without the persons, and then MERGE both back into the table projection? So table projecton might look like this. I guess this is done with .table().it{}cap, but what I am not sure, is how to do a split and merge in parallel and then get that merge projected into the same table. I don't quite understand your problem, but here is an example of splitting and merging. g.v(1).out('knows').copySplit(_().out('knows').name, _().out('created').name).fairMerge This will get all the people that v[1] knows and then generate two parallel pipeline. Each friend of v[1] is copied to each of the 2 parallel pipelines. One pipeline will get their friend's names and one will get their created project's names. It will then merge those two parallel pipelines into a single stream. You can do either fairMerge or exhaustMerge depending on the merging algorithm you want. fairMerge is more memory efficient. I need to write more about split/merge in the Gremlin documentation. https://github.com/tinkerpop/gremlin/wiki/Split-Merge-Pattern -- will work on it :) HTH, Marko. http://markorodriguez.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Gremlin Query - Help
Hi, Scenario 1: I would like to get all Nodes that do not have a relationship to another node. What is the best way to do this Gremlin? Root = NodeA = NodeB Root = NodeC Output should be NodeC I don't understand the problem. Scenario 2: Root = User - Centre I would like to get all centres for userA, and then get all users who are also linked to the same centres of the userA userA.out('hasCentre').in('hasCentre').except([userA]) Scenario 3: User = Centre I would like to get all users that do not have a link to a Centre, and if this is the case, do a projection that returns a fake centre with property Unknown g.V.ifThenElse{it.out('hasCentre').filter{it == aCentre}.hasNext()}{}{println ${it} has center unknown} If you have an index of your Users, then its more efficient to hit that index, then iterate through all vertices (g.V). E.g. g.idx(T.v)[[type:'User']].ifThenElse Scenario 4: REFERRAL = PERSON I would like to combine a query that gets all Referrals that are linked to a person and project a table result (contains referrals and person property values (this is easy to do) However, I then want to do a SPLIT query, that gets referrals without the persons, and then MERGE both back into the table projection? So table projecton might look like this. I guess this is done with .table().it{}cap, but what I am not sure, is how to do a split and merge in parallel and then get that merge projected into the same table. I don't quite understand your problem, but here is an example of splitting and merging. g.v(1).out('knows').copySplit(_().out('knows').name, _().out('created').name).fairMerge This will get all the people that v[1] knows and then generate two parallel pipeline. Each friend of v[1] is copied to each of the 2 parallel pipelines. One pipeline will get their friend's names and one will get their created project's names. It will then merge those two parallel pipelines into a single stream. You can do either fairMerge or exhaustMerge depending on the merging algorithm you want. fairMerge is more memory efficient. I need to write more about split/merge in the Gremlin documentation. https://github.com/tinkerpop/gremlin/wiki/Split-Merge-Pattern -- will work on it :) HTH, Marko. http://markorodriguez.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Gremlin Query - Help
Marko, Thank you very much, I really appreciate it, I will start going through your response here. I have also added the copy/split aggregate functionality into our Gremlin Client. I was not aware of the if then else as well, will extend our client to support this. Apologise, will explain Scenario One. I have a User Node that has a relationship LINKED_TO_CENTRE I would like to get a query that can give me all Users that do not have a relationship LINKED_TO_CENTRE. I was thinking of the Except/Retain pattern for this, e.g. get all users as aggregate A then get all users linked as aggregate b - then use except/retain or something along these lines. On Another note, is there a way to get unique()._() to preserve all previous pipes and placeholders, the reason is I want to use unique() before doing a table projection. And unique breaks closures? ( I have a separate post on this in the mail list) Marko, if you interested here is how the .NET code looks like that I am currently trying to write to generate a report. Its not yet finished as I need to take into consideration your feedback, but I am sure I will get their eventually. //ToDo Chained 'As' statements are reversed, bug in gremlin plugin with chained as - https://github.com/neo4j/community/issues/114 var resultSet = graphClient .RootNode .OutAgency(Hosts.TypeKey, a = a.Key == userIdentifier.AgencyKey) .InUser(UserBelongsTo.TypeKey, u = u.Username == userIdentifier.Username) .OutCentre(UserLinkedToCentre.TypeKey) .As(Centre) .InUser(UserLinkedToCentre.TypeKey) //.GremlinDistinct() - breaks pipes for table output .As(UserGivenName) .As(UserFamilyName) .InReferral(CreatedBy.TypeKey, r = r.Completed == false) .As(ReferralId) .OutReferralWhoSection(ReferralHasWhoSection.TypeKey) .As(ReferralDate) .OutReferralParticipant(HasParticipant.TypeKey) .As(ParticipantName) .InReferralWhoSection(HasParticipant.TypeKey) .InReferral(ReferralHasWhoSection.TypeKey) //.GremlinDistinct() - breaks pipes for table output .TableReferralByGroup, Centre, User, User, Referral, Referral, ReferralParticipant( centre = centre.Name, user = user.FamilyName, user = user.GivenName, referral = referral.UniqueId, referral2 = referral2.DateInitiatedUtc, participant = participant.Name ); Thank You Much appreciated -Original Message- From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org] On Behalf Of Marko Rodriguez Sent: Saturday, 3 December 2011 4:10 AM To: Neo4j user discussions Subject: Re: [Neo4j] Gremlin Query - Help Hi, Scenario 1: I would like to get all Nodes that do not have a relationship to another node. What is the best way to do this Gremlin? Root = NodeA = NodeB Root = NodeC Output should be NodeC I don't understand the problem. Scenario 2: Root = User - Centre I would like to get all centres for userA, and then get all users who are also linked to the same centres of the userA userA.out('hasCentre').in('hasCentre').except([userA]) Scenario 3: User = Centre I would like to get all users that do not have a link to a Centre, and if this is the case, do a projection that returns a fake centre with property Unknown g.V.ifThenElse{it.out('hasCentre').filter{it == aCentre}.hasNext()}{}{println ${it} has center unknown} If you have an index of your Users, then its more efficient to hit that index, then iterate through all vertices (g.V). E.g. g.idx(T.v)[[type:'User']].ifThenElse Scenario 4: REFERRAL = PERSON I would like to combine a query that gets all Referrals that are linked to a person and project a table result (contains referrals and person property values (this is easy to do) However, I then want to do a SPLIT query, that gets referrals without the persons, and then MERGE both back into the table projection? So table projecton might look like this. I guess this is done with .table().it{}cap, but what I am not sure, is how to do a split and merge in parallel and then get that merge projected into the same table. I don't quite understand your problem, but here is an example of splitting and merging. g.v(1).out('knows').copySplit(_().out('knows').name, _().out('created').name).fairMerge This will get all the people that v[1] knows and then generate two parallel pipeline. Each friend of v[1] is copied to each of the 2 parallel pipelines. One pipeline will get their friend's names and one will get their created project's names. It will then merge those two
[Neo4j] Gremlin Query - Help
Hi, Scenario 1: I would like to get all Nodes that do not have a relationship to another node. What is the best way to do this Gremlin? Root = NodeA = NodeB Root = NodeC Output should be NodeC Scenario 2: Root = User - Centre I would like to get all centres for userA, and then get all users who are also linked to the same centres of the userA Scenario 3: User = Centre I would like to get all users that do not have a link to a Centre, and if this is the case, do a projection that returns a fake centre with property Unknown Scenario 4: REFERRAL = PERSON I would like to combine a query that gets all Referrals that are linked to a person and project a table result (contains referrals and person property values (this is easy to do) However, I then want to do a SPLIT query, that gets referrals without the persons, and then MERGE both back into the table projection? So table projecton might look like this. I guess this is done with .table().it{}cap, but what I am not sure, is how to do a split and merge in parallel and then get that merge projected into the same table. ReferralId, Name 1, Bob 2, Jill 3, null 4, null ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user