[ 
https://issues.apache.org/jira/browse/TINKERPOP-881?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

stephen mallette closed TINKERPOP-881.
--------------------------------------
    Resolution: Later

> [Proposal] A Process-Based Graph Reasoner
> -----------------------------------------
>
>                 Key: TINKERPOP-881
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-881
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: process
>    Affects Versions: 3.0.2-incubating
>            Reporter: Marko A. Rodriguez
>            Priority: Major
>
> This would be a big initiative, so its more than "just a ticket," but it 
> would be a neat idea.
> A reasoner allows someone to express implicit edges/properties in the graph. 
> For instance, it is possible to say that {{ancestor}} is transitive. If there 
> was an explicit graph structure like:
> {code}
> marko--ancestor-->jose--ancestor-->fernando--ancestor-->someSpanishDude
> {code}
> Then when you did the following query:
> {code}
> gremlin> g.V.has('name','marko').out('ancestor').name
> ==>jose
> ==>fernando
> ==>someSpanishDude
> {code}
> That is, because it is declared the {{ancestor}} is transitive, the implicit 
> {{marko--ancestor-->someSpanishDude}} is generated. Now, there are two types 
> of reasoners: structure and process.
> A *structure reasoner* will infer all the entailments of the schema when the 
> graph is modified (added to or deleted from). Thus, what is implicit is made 
> explicit and put into the graph. With this model, your data set has more data 
> than what was explicitly put into it.
> A *process reasoner* will infer all the entailments of the schema as it 
> pertains to the current query being executed. Thus, what is implicit is made 
> explicit at query runtime. With this model, you data set contains only what 
> was explicitly inserted.
> These two models either make a sacrifice of space or time.
> If we wanted just a *process reasoner*, then this could be a 
> {{ReasoningStrategy extends DecorationStrategy}}. Where the above 
> {{ancestor}} query would be rewritten as:
> {code}
> g.V.has('name','marko').repeat(out('ancestor')).emit().name
> {code}
> In essence, "transitive" means {{repeat(...).until(false).emit()}} (loop 
> until you can loop no more).
> I prefer the *process reasoner* model as its less cumbersome and potentially 
> damaging to the integrity of the underlying data set. Moreover, it can be 
> "easily" implemented as a {{TraversalStrategy}}. 
> The next question is, how is the reasoning schema (ontology) specified? 
> Perhaps via a builder?
> {code}
> ReasoningStrategy.build().
>   .transitive("ancestor")
>   .subEdge("hasPet","likes") // if I have a pet dog, I like dogs.
>   .symmetric("friend") // a.friend.b implies b.friend.c
>   .functional("marriedTo") // a.marriedTo.b, c.marriedTo.b ==> a=c
>   ...other stuff
>   .create();
> {code}
> Here are some links to study:
> * https://jena.apache.org/documentation/inference/#the-owl-reasoner
> * http://owl.man.ac.uk/2003/why/latest/
> In my experience, you can do a lot with support for the basics: transitive, 
> symmetric, etc.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to