From d4c0aca9c86fd966f727fa53d4baa703dde979ae Mon Sep 17 00:00:00 2001 From: Daniel Dahan Date: Thu, 14 Jan 2016 16:57:08 -0500 Subject: [PATCH] updated README and example projects --- Examples/Entity/Entity/ViewController.swift | 11 +-- .../Relationship.xcodeproj/project.pbxproj | 6 -- .../Relationship/ViewController.swift | 26 +++---- README.md | 69 ++++++------------ Resources/GraphKit.png | Bin 0 -> 36801 bytes 5 files changed, 41 insertions(+), 71 deletions(-) create mode 100644 Resources/GraphKit.png diff --git a/Examples/Entity/Entity/ViewController.swift b/Examples/Entity/Entity/ViewController.swift index 8091d48e..686d714f 100644 --- a/Examples/Entity/Entity/ViewController.swift +++ b/Examples/Entity/Entity/ViewController.swift @@ -29,8 +29,9 @@ */ /* -The following ViewController exemplifies the usage of Entities. In this example, -there are Person Entity types that are displayed in a list. +The following ViewController exemplifies the usage of Entities. +In this example, there are Person Entity types that are displayed +in a list. */ import UIKit @@ -43,7 +44,7 @@ class ViewController: UIViewController { /// A tableView used to display Entity entries. private let tableView: UITableView = UITableView() - /// A list of all the People Entities. + /// A list of all the Person Entities. private var people: Array = Array() override func viewDidLoad() { @@ -67,7 +68,7 @@ class ViewController: UIViewController { that may be used for various benefits. As well, since the graph is watching Person Entities, the graphDidInsertEntity delegate method is executed once - the save is complete. + the save has completed. */ graph.save { (success: Bool, error: NSError?) in if let e: NSError = error { @@ -115,7 +116,7 @@ class ViewController: UIViewController { that may be used for various benefits. As well, since the graph is watching Person Entities, the graphDidInsertEntity delegate method is executed once - the save is complete. + the save has completed. */ graph.save { (success: Bool, error: NSError?) in if let e: NSError = error { diff --git a/Examples/Relationship/Relationship.xcodeproj/project.pbxproj b/Examples/Relationship/Relationship.xcodeproj/project.pbxproj index 873dd225..684063b3 100644 --- a/Examples/Relationship/Relationship.xcodeproj/project.pbxproj +++ b/Examples/Relationship/Relationship.xcodeproj/project.pbxproj @@ -15,8 +15,6 @@ 964D15321C4816F400613737 /* ElonMusk.png in Resources */ = {isa = PBXBuildFile; fileRef = 964D152E1C4816F400613737 /* ElonMusk.png */; }; 964D15331C4816F400613737 /* MarkZuckerberg.png in Resources */ = {isa = PBXBuildFile; fileRef = 964D152F1C4816F400613737 /* MarkZuckerberg.png */; }; 964D15341C4816F400613737 /* TimCook.png in Resources */ = {isa = PBXBuildFile; fileRef = 964D15301C4816F400613737 /* TimCook.png */; }; - 964D15361C48177800613737 /* GraphKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 964D15351C48177800613737 /* GraphKit.framework */; }; - 964D15371C48177800613737 /* GraphKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 964D15351C48177800613737 /* GraphKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -26,7 +24,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 964D15371C48177800613737 /* GraphKit.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -44,7 +41,6 @@ 964D152E1C4816F400613737 /* ElonMusk.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ElonMusk.png; sourceTree = ""; }; 964D152F1C4816F400613737 /* MarkZuckerberg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MarkZuckerberg.png; sourceTree = ""; }; 964D15301C4816F400613737 /* TimCook.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = TimCook.png; sourceTree = ""; }; - 964D15351C48177800613737 /* GraphKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = GraphKit.framework; path = "/Users/danieldahan/Library/Developer/Xcode/DerivedData/GraphKit-armxrasbxnehbyefytcidxvmfcbv/Build/Products/Debug-iphoneos/GraphKit.framework"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -52,7 +48,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 964D15361C48177800613737 /* GraphKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -62,7 +57,6 @@ 964D150F1C48165F00613737 = { isa = PBXGroup; children = ( - 964D15351C48177800613737 /* GraphKit.framework */, 964D151A1C48165F00613737 /* Relationship */, 964D15191C48165F00613737 /* Products */, ); diff --git a/Examples/Relationship/Relationship/ViewController.swift b/Examples/Relationship/Relationship/ViewController.swift index 2dc31cf2..83da2742 100644 --- a/Examples/Relationship/Relationship/ViewController.swift +++ b/Examples/Relationship/Relationship/ViewController.swift @@ -29,15 +29,15 @@ */ /* -The following ViewController exemplifies the usage of Relationships forming -relationships between Entities. In this example, there are Person and -Company Entity types that are related through an Employee relationship. +The following ViewController exemplifies the usage of Relationships. +In this example, there are Person and Company Entity types that are +related through an Employee Relationship. -For example: Person is Employee of Company. +For example: Person is an Employee of Company. -Person is the sbject of the relationship. -Employee is the relationship. -Company is the object of the relationship. +Person is the sbject of the Relationship. +Employee is the Relationship type. +Company is the object of the Relationship. */ import UIKit @@ -76,7 +76,7 @@ class ViewController: UIViewController { // Create an Employee Relationship. let employee: Relationship = Relationship(type: "Employee") - // Make relationships. + // Form the relationship. employee.subject = person employee.object = company @@ -85,7 +85,7 @@ class ViewController: UIViewController { that may be used for various benefits. As well, since the graph is watching Employee Relationships, the graphDidInsertRelationship delegate method is executed once - the save is complete. + the save has completed. */ graph.save { (success: Bool, error: NSError?) in if let e: NSError = error { @@ -110,7 +110,7 @@ class ViewController: UIViewController { private func prepareEmployees() { employees = graph.searchForRelationship(types: ["Employee"]) - // Add Employee relationships if none exist. + // Add Employee Relationships if none exist. if 0 == employees.count { // Create Person Entities. let tim: Entity = Entity(type: "Person") @@ -143,7 +143,7 @@ class ViewController: UIViewController { let employee2: Relationship = Relationship(type: "Employee") let employee3: Relationship = Relationship(type: "Employee") - // Make relationships. + // Form relationships. employee1.subject = tim employee1.object = apple @@ -158,7 +158,7 @@ class ViewController: UIViewController { that may be used for various benefits. As well, since the graph is watching Employee Relationships, the graphDidInsertRelationship delegate method is executed once - the save is complete. + the save has completed. */ graph.save { (success: Bool, error: NSError?) in if let e: NSError = error { @@ -209,7 +209,7 @@ extension ViewController: UITableViewDataSource { func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: UITableViewCell = UITableViewCell(style: .Subtitle, reuseIdentifier: "Cell") - // Get the Relationship relationship. + // Get the Relationship. let employee: Relationship = employees[indexPath.row] // Set the Person details. diff --git a/README.md b/README.md index 6c90af1d..ed5254e1 100644 --- a/README.md +++ b/README.md @@ -92,13 +92,12 @@ GraphKit is a growing project and will encounter changes throughout its developm ## A Tour * [Entity](#entity) -* [Bond](#bond) +* [Relationship](#relationship) * [Action](#action) * [Groups](#groups) * [Probability](#probability) * [Data Driven](#datadriven) * [Faceted Search](#facetedsearch) -* [JSON](#json) * [Data Structures](#datastructures) * [DoublyLinkedList](#doublylinkedlist) * [Stack](#stack) @@ -113,7 +112,7 @@ GraphKit is a growing project and will encounter changes throughout its developm ## Entity -An Entity is a model object that represents a person, place, or thing. For example a Person, Company, Photo, Video, or Note -- pretty much anything that you would like to objectify. To distinguish between different Entity types, the _type_ instance property is set upon instantiation of a new Entity. For Example, creating different Entity types is as easy as the code below. +An **Entity** is a model object that **represents a person, place, or thing**. For example, a Company, Photo, Video, User or Note. In code, the following is how this would look. ```swift // Create a Person Entity. @@ -128,10 +127,10 @@ company["name"] = "Tesla Motors" [Learn More About Entities](https://github.com/CosmicMind/GraphKit/wiki/Entity) - -## Bond + +## Relationship -A Bond is a model object that represents a relationship between two [Entities](https://github.com/CosmicMind/GraphKit/wiki/Entity). To distinguish between different Bond types, the _type_ instance property is set upon instantiation of a new Bond. To form meaningful relationships, sentence structures are used, with a _subject_ and _object_ that form the relationship. For example, we have two Entity types, a Person and a Company. The relationship between the two is that the Person is an Employee of the Company. So how is this modeled? In a sentence it would be, _Person is Employee of Company_. The Person is the _subject_, and the _object_ is the Company. In code, the following is how this would look. +A **Relationship** is a model object that **forms a relationship between two Entities**. For example, "Person is an Employee of Company". _Person_ and _Company_ are two Entities that form a Relationship -- of type _Employee_. In code, the following is how this would look. ```swift // Create a Person Entity. @@ -143,44 +142,42 @@ person["lastName"] = "Zuckerberg" let company: Entity = Entity(type: "Company") company["name"] = "Facebook" -// Create an Employee Bond. -let employee: Bond = Bond(type: "Employee") +// Create an Employee Relationship. +let employee: Relationship = Relationship(type: "Employee") employee["startDate"] = "February 4, 2004" -// Make the relationship. -employee.subject = user +// Form the relationship. +employee.subject = person employee.object = company ``` -Notice that information about the relationship is stored within the Bond leaving both _Mark_ and _Facebook_ to form other relationships freely without any of the relationship information. This is a key principal when using Bonds. +Notice that information about the relationship is stored within the _Employee_ Relationship leaving both _Mark_ and _Facebook_ to form other relationships freely. This is a key principal when using Relationships. -[Learn More About Bonds](https://github.com/CosmicMind/GraphKit/wiki/Bond) +[Learn More About Relationships](https://github.com/CosmicMind/GraphKit/wiki/Relationship) ## Action -An Action is used to form a relationship between many Entity Objects. Like an Entity, an Action also has a type property that specifies the collection to which it belongs to. An Action's relationship structure is like a sentence, in that it relates a collection of Subjects to a collection of Objects. Below is an example of a User purchasing many Books. It may be thought of as "User Purchased these Book(s)." +An **Action** is a model object that **forms a relationship between a collection of Entity subjects and a collection of Entity objects**. For example, "Person Purchased many Books". The _Purchased_ Action captures the _Person_ Entity and _Book_ Entities in a single relationship that may be used later to ask questions like, "what Books has the Person Purchased?", or "Has the Person Purchased a physics Book?". In code, the following is how this would look. ```swift -let graph: Graph = Graph() - -let user: Entity = Entity(type: "User") +let person: Entity = Entity(type: "Person") let books: Array = graph.searchForEntity(types: ["Book"]) let purchased: Action = Action(type: "Purchased") -purchased.addSubject(user) +purchased.addSubject(person) for book in books { purchased.addObject(book) } - -graph.save() ``` +[Learn More About Actions](https://github.com/CosmicMind/GraphKit/wiki/Action) + ## Groups -Groups are used to organize Entities, Bonds, and Actions into different collections from their types. This allows multiple types to exist in a single collection. For example, a Photo and Video Entity type may exist in a group called Media. Another example may be including a Photo and Book Entity type in a Favorites group for your users' account. Below are examples of using groups. +Groups are used to organize Entities, Relationships, and Actions into different collections from their types. This allows multiple types to exist in a single collection. For example, a Photo and Video Entity type may exist in a group called Media. Another example may be including a Photo and Book Entity type in a Favorites group for your users' account. Below are examples of using groups. ```swift let photo: Entity = Entity(type: "Photo") @@ -223,7 +220,7 @@ Recommending a Physics book if the user is likely to buy a Physics book. ```swift let purchased: Array = graph.searchForAction(types: ["Purchased"]) -let pOfX: Double = purchased.probabilityOf { (action: Action) in +let probabilityOfX: Double = purchased.probabilityOf { (action: Action) in if let entity: Entity = action.objects.first { if "Book" == entity.type { return entity.hasGroup("Physics") @@ -232,7 +229,7 @@ let pOfX: Double = purchased.probabilityOf { (action: Action) in return false } -if 33.33 < pOfX { +if 33.33 < probabilityOfX { // Recommend a Physics book. } ``` @@ -274,7 +271,7 @@ func graphDidInsertAction(graph: Graph, action: Action) { ## Faceted Search -To explore the intricate relationships within the Graph, the search API adopts a faceted design. This allows the exploration of your data through any view point. The below examples show how to use the Graph search API: +To explore the intricate relationships within GraphKit, the search API adopts a faceted design. The below examples show how to use the _Graph_ search API: Searching multiple Entity types. @@ -313,28 +310,6 @@ let collection: Array = graph.searchForAction(types: ["Purchased"]).filt } ``` - -## JSON - -JSON is a widely used format for serializing data. GraphKit comes with a JSON toolset. Below are some examples of its usage. - -```swift -// Serialize Dictionary. -let data: NSData? = JSON.serialize(["user": ["username": "daniel", "password": "abc123", "token": 123456789]]) - -// Parse NSData. -let j1: JSON? = JSON.parse(data!) -print(j1?["user"]?["username"]?.asString) // Output: "daniel" - -// Stringify. -let stringified: String? = JSON.stringify(j1!) -print(stringified) // Output: "{\"user\":{\"password\":\"abc123\",\"token\":123456789,\"username\":\"daniel\"}}" - -// Parse String. -let j2: JSON? = JSON.parse(stringified!) -print(j2?["user"]?["token"]?.asInt) // Output: 123456789 -``` - ## Data Structures @@ -468,8 +443,8 @@ SortedSets are a powerful data structure for algorithm and analysis design. Elem ```swift let graph: Graph = Graph() -let setA: SortedSet = SortedSet(elements: graph.searchForBond(types: ["Author"])) -let setB: SortedSet = SortedSet(elements: graph.searchForBond(types: ["Director"])) +let setA: SortedSet = SortedSet(elements: graph.searchForRelationship(types: ["Author"])) +let setB: SortedSet = SortedSet(elements: graph.searchForRelationship(types: ["Director"])) let setC: SortedSet = SortedSet(elements: graph.searchForEntity(groups: ["Physics"])) let setD: SortedSet = SortedSet(elements: graph.searchForEntity(groups: ["Math"])) diff --git a/Resources/GraphKit.png b/Resources/GraphKit.png new file mode 100644 index 0000000000000000000000000000000000000000..2339f6494449617e57dbc79d665339bbaf50dce2 GIT binary patch literal 36801 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 gZwYwTVakrk4fA__i!K?5