A Lightweight and simple object graph mapper (OGM) for Neo4j which support transactions and BOLT protocol.
NeoClient is available on NuGet.
dotnet add package NeoClient
- NeoClient: Neo4j Movies Example Application - Asp.net WebApi Version
Optional you can pass authentication credential via the constructor.
INeoClient client = new NeoClient(
uri: "bolt://localhost:7687",
userName: "user", //optional
password: "password", //optional
config: Config.Builder //optional
.WithMaxConnectionLifetime(TimeSpan.FromMinutes(30))
.WithMaxConnectionPoolSize(100)
.WithConnectionAcquisitionTimeout(TimeSpan.FromMinutes(2))
.WithEncryptionLevel(EncryptionLevel.None)
.ToConfig()
strip_hyphens: true //optional, default is false
);
client.Connect();
For example, if you were using any IoC container, you could register the client like so:
container.Register<INeoClient>((c, p) =>
{
INeoClient client = new NeoClient(
uri: "bolt://localhost:7687",
...
);
client.Connect();
return client;
});
public class User : EntityBase
{
public User() : base(label: "User") { }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
User entity = client.Add(new User { Email = "kir.oktay@gmail.com", FirstName = "Oktay", LastName = "Kir" });
bool result = client.AddLabel(
uuid: "01a68df3-cc35-4eb0-a199-0d924da86eab",
labelName: @"LabelName"
);
User node = client.GetByUuidWithRelatedNodes<User>("01a68df3-cc35-4eb0-a199-0d924da86eab");
IList<User> nodes = client.GetAll<User>();
IList<User> nodes = client.GetByProperty<User>("Email", "kir.oktay@gmail.com");
var properties = new Dictionary<string, object>(){
{ nameof(User.Name), "keanu"},
};
IList<User> nodes = client.GetByProperties<User>(properties);
User updatedNode = client.Update(
entity: node,
uuid: "01a68df3-cc35-4eb0-a199-0d924da86eab",
fetchResult: true //optional, default is false
);
User node = client.Delete<User>("01a68df3-cc35-4eb0-a199-0d924da86eab");
bool result = client.Drop<User>("01a68df3-cc35-4eb0-a199-0d924da86eab");
int nodesDeleted = client.DropByProperties<User>(
props: new Dictionary<string, object>(){
{ nameof(User.Name), "keanu"},
}
);
bool isCreated = client.CreateRelationship(
uuidFrom: "2ac55031-3089-453a-a858-e1a9a8b68a16",
uuidTo: "ac43523a-a15e-4d25-876e-e2a2cc4de125",
relationshipAttribute: new RelationshipAttribute{
Direction = DIRECTION.INCOMING,
Name = "FAMILY"
},
props: new Dictionary<string, object>(){ //optional
{"CreatedAt", DateTime.UtcNow},
{"Kinship_Level", 1},
{"Name", "FakeName"}
}
);
bool result = client.DropRelationshipBetweenTwoNodes(
uuidFrom: "2ac55031-3089-453a-a858-e1a9a8b68a16",
uuidTo: "ac43523a-a15e-4d25-876e-e2a2cc4de125",
relationshipAttribute: node.GetRelationshipAttributes(ep => ep.roles).FirstOrDefault()
);
Creating a node with its properties on creation time. If the nodes had already been found, different multiple properties would have been set.
User node = client.Merge(
entityOnCreate: new User(){ name = "keanu"; createdAt = DateTime.UtcNow.ToTimeStamp(); },
entityOnUpdate: new User(){ name = "keanu"; updatedAt = DateTime.UtcNow.ToTimeStamp(); },
where: "name:\"keanu\""
);
bool result = client.MergeRelationship(
uuidFrom: "2ac55031-3089-453a-a858-e1a9a8b68a16",
uuidTo: "ac43523a-a15e-4d25-876e-e2a2cc4de125",
relationshipAttribute: node.GetRelationshipAttributes(ep => ep.roles).FirstOrDefault()
);
string cypherCreateQuery = @"CREATE (Neo:Crew {name:'Neo'}),
(Morpheus:Crew {name: 'Morpheus'}),
(Trinity:Crew {name: 'Trinity'}),
(Cypher:Crew:Matrix {name: 'Cypher'}),
(Smith:Matrix {name: 'Agent Smith'}),
(Architect:Matrix {name:'The Architect'}),
(Neo)-[:KNOWS]->(Morpheus),
(Neo)-[:LOVES]->(Trinity),
(Morpheus)-[:KNOWS]->(Trinity),
(Morpheus)-[:KNOWS]->(Cypher),
(Cypher)-[:KNOWS]->(Smith),
(Smith)-[:CODED_BY]->(Architect)";
IStatementResult result = client.RunCustomQuery(query: cypherQuery);
string cypherQuery = @"MATCH (n:Crew)-[r:KNOWS*]-(m) WHERE n.name='Neo' RETURN n AS Neo,r,m";
IStatementResult queryResult = client.RunCustomQuery(query: cypherQuery);
IList<object> result = queryResult.GetValues();
string cypherQuery = @"MATCH (n:User) RETURN n";
IList<User> result = client.RunCustomQuery<User>(query: cypherQuery);
NeoClient has several tests that verify that its ability to use the system it integrates with correctly.
There's a docker-compose file and you can use the following command to launch Neo4j container for running the integration tests.
$ docker-compose up -d
- Nuget package
- Integration Tests
- Creating example projects
- Supporting more functionalities
- Fork it ( https://github.com/OKTAYKIR/NeoClient/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
Please βοΈ this repository if this project helped you!