Neo4jObjectMapper 1.1.0-alpha.2
dotnet add package Neo4jObjectMapper --version 1.1.0-alpha.2
NuGet\Install-Package Neo4jObjectMapper -Version 1.1.0-alpha.2
<PackageReference Include="Neo4jObjectMapper" Version="1.1.0-alpha.2" />
paket add Neo4jObjectMapper --version 1.1.0-alpha.2
#r "nuget: Neo4jObjectMapper, 1.1.0-alpha.2"
// Install Neo4jObjectMapper as a Cake Addin #addin nuget:?package=Neo4jObjectMapper&version=1.1.0-alpha.2&prerelease // Install Neo4jObjectMapper as a Cake Tool #tool nuget:?package=Neo4jObjectMapper&version=1.1.0-alpha.2&prerelease
Neo4j Object Mapper
Welcome to the wiki for the Neo4j Object Mapper library. This an object mapper based on .NET Standard 2.0 . Using this library does require the developer to have some knowledge about Cypher.
The NeoContext is supposed to be used as a single instance per application just like the official neo4j driver itself.
Query a single node
Example Models
public class Person
{
public Guid Id { get; set; }
public int Age { get; set; }
public string Name { get; set; }
public double Salary { get; set; }
public DateTime DateOfBirth { get; set; }
public IList<Owns> Owns { get; set; }
}
//In neo4j this will be our relation between person and house. So a person will own a house.
public class Owns
{
public DateTime OwnedFrom { get; set; }
public DateTime OwnedTill { get; set; }
public House House { get; set; }
}
public class House
{
public string Address { get; set; }
public int Age { get; set; }
}
The mapper will map all value types to the corresponding properties of the model. Property names are treated case-insensitive.
Querying a single node
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
INeoContext context = new NeoContext(Driver);
//Query default will return the first record it gets from the neo4j database.
Person person = await context.QueryDefault<Person>("MATCH (p:Person) RETURN p");
Querying a single node with parameters
Parameters have to be prefixed with a $ inside the cypher query. All of the Query methods have support for parameterized queries.
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
INeoContext context = new NeoContext(Driver);
Guid personGuid = Guid.NewGuid();
var parameters = new Dictionary<string, object>();
parameters.Add("p1", "neo");
//As guids aren't supported by neo4j you will have to stringify it when using it as a parameter.
//However, models can have guid properties as the library converts the guid to a string and back to a guid when queried.
parameters.Add("p2", personGuid.ToString());
Person resultPerson = await context.QueryDefault<Person>("MATCH (p:Person { Name: $p1 , Id: $p2 }) RETURN p",parameters);
Query a single node and his relations with other nodes
The mapping function is very similar to how it's used in Dapper.
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
INeoContext context = new NeoContext(Driver);
Dictionary<Guid, Person> personContainer = new Dictionary<Guid, Person>();
Person personResult = await context.QueryDefaultIncludeable<Person, Owns, House>("MATCH (p:Person { Name: 'neo' })-[o:Owns]->(h:House) return p,o,h",
(person, owns, house) =>
{
if (!personContainer.ContainsKey(person.Id))
{
personContainer.Add(person.Id, person);
person.Owns = new List<Owns>();
}
personContainer[p.Id].Owns.Add(o);
owns.House = house;
return personContainer[p.Id];
}
);
Querying multiple nodes
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
INeoContext context = new NeoContext(Driver);
IEnumerable<Person> personsResult = await context.QueryMultiple<Person>("MATCH (p:Person) return p");
Inserting nodes and relations
Inserting a node
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
Person person = new Person()
{
Age = 50,
DateOfBirth = DateTime.Now.AddYears(-50),
Id = Guid.NewGuid(),
Name = "neo",
Salary = 5400.77,
};
INeoContext context = new NeoContext(Driver);
IResultSummary resultExecuting = await context.InsertNode<Person>(person);
Inserting a relation between existing nodes
Relations without properties are also supported. Simply create a class without properties. The class name will become the relation type.
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
Owns own = new Owns()
{
OwnedFrom = DateTime.Now.AddYears(-2),
OwnedTill = DateTime.Now.AddYears(-1),
};
INeoContext context = new NeoContext(Driver);
IResultSummary resultSummary = await context.InsertRelation<Owns>(
"MATCH (p:Person { Name : 'neo' }) " +
"MATCH (h:House { Address: 'test address' })", "p", "h",
own
);
Inserting a new node with a relation to another new node
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
var person = new Person()
{
Age = 50,
DateOfBirth = DateTime.Now.AddYears(-50),
Id = Guid.NewGuid(),
Name = "neo",
Salary = 5400.77,
Owns = new List<Owns>()
{
new Owns()
{
OwnedFrom = DateTime.Now.AddYears(-2),
OwnedTill = DateTime.Now.AddYears(-1),
House = new House()
{
Address = "test address",
Age = 150
}
}
}
};
INeoContext context = new NeoContext(Driver);
IResultSummary resultExecuting = await context.InsertNodeWithRelation<Person, Owns, House>(person, person.Owns.First(), person.Owns.First().House);
Transactions
The transaction context acts exactly like the INeoContext only it does everything through a transaction.
IDriver Driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
INeoContext context = new NeoContext(Driver);
Person person = new Person()
{
Age = 50,
DateOfBirth = DateTime.Now.AddYears(-50),
Id = Guid.NewGuid(),
Name = "neo",
Salary = 5400.77,
};
//The transactionContext is capable of doing everything the INeoContext can do.
//Don't forget to rollback or commit the transaction at the end of the function.
await context.UseTransaction((transactionContext) =>
{
await transactionContext.InsertNode<Person>(person);
await transactionContext.CommitTransaction();
});
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.1
- Neo4j.Driver (>= 4.0.0)
- System.Reflection.Emit.ILGeneration (>= 4.7.0)
- System.Reflection.Emit.Lightweight (>= 4.7.0)
-
.NETStandard 2.0
- Neo4j.Driver (>= 4.0.0)
- System.Reflection.Emit.ILGeneration (>= 4.7.0)
- System.Reflection.Emit.Lightweight (>= 4.7.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
1.1.0-alpha.2 | 404 | 5/28/2020 | |
1.1.0-alpha | 1,157 | 5/28/2020 | |
1.0.2 | 1,339 | 5/28/2020 | |
1.0.1 | 1,303 | 5/25/2020 | |
1.0.0 | 1,822 | 5/24/2020 |
Alpha version of 1.1.0 . Introduces new features like query based caching done by the library itself.