Skip to main content

Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "Org.eclipse.higgins.js.pds.client API usage example"

(Staples template)
(Execution)
 
(81 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{#eclipseproject:technology.higgins|eclipse_custom_style.css}}
 
{{#eclipseproject:technology.higgins|eclipse_custom_style.css}}
  
Example call to .pds.client.getAttributes(domain, audience, attributes[], where[], future)
+
We show an example of calling getAttributes and then calling setAttributes. In all cases we read/write the same two attributes in the nytimes.com namespace, bFirstName and phone.
  
* atts[0] := (http://nytimes#phone, false, nil)   // a phone number
+
TODO: a more realistic scenario would be showing a call to getCredentials() and then a call to setCredentials() followed by the getAttributes () and setAttributes () calls that are documented here.
* atts[1] := (http://nytimes#bFirstName, false, nil)   // "billing first name"
+
* getAttributes (''"nytimes.com", nil, atts, nil, nil'')
+
  
 
==Initial State==
 
==Initial State==
  
 
===Contexts===
 
===Contexts===
[[Image:Pds.client.example 2.0.100a.png]]
+
[[Image:Pdsclient api example initial 2.0.108.png|center]]
  
 
===NYTimes template===
 
===NYTimes template===
  
The template context http://azigo.com/sys/templates/nytimes.com contains (among other things) the following mapping rules:
+
The template context http://azigo.com/sys/templates/nytimes.com contains (among other things) a class named "http://nytimes.com" that has the following mapping rules:
  
 
   :NYTimesPerson
 
   :NYTimesPerson
 
       a      owl:Class ;
 
       a      owl:Class ;
 
       rdfs:subClassOf <http://www.eclipse.org/higgins/ontologies/2010/6/higgins#Person> ;
 
       rdfs:subClassOf <http://www.eclipse.org/higgins/ontologies/2010/6/higgins#Person> ;
 +
rule #1:
 
       map:nameRule
 
       map:nameRule
               [ a      map:roleSameAs ;
+
               [ rdf:type map:rolePathLiteral ;
                 map:equivalentAttribute
+
                 map:mappedAtt <http://www.w3.org/2006/vcard/ns#given-name> ;
                        fp:givenName ;
+
                map:path <http://www.w3.org/2006/vcard/ns#n> ;
 
                 map:predicate :bFirstName ;
 
                 map:predicate :bFirstName ;
 
                 map:role <http://www.eclipse.org/higgins/ontologies/2010/6/persona#Buyer>
 
                 map:role <http://www.eclipse.org/higgins/ontologies/2010/6/persona#Buyer>
 
               ] ;
 
               ] ;
       map:telephoneRule
+
rule #2:
               [ a      map:roleSameAs ;
+
       map:relationshipsRule
 +
               [ rdf:type map:roleSameAs ;
 
                 map:equivalentAttribute
 
                 map:equivalentAttribute
                         fp:phone ;
+
                         fp:gender ;
                 map:predicate :phone ;
+
                 map:predicate :gender ;
 
                 map:role <http://www.eclipse.org/higgins/ontologies/2010/6/persona#Ecommerce>
 
                 map:role <http://www.eclipse.org/higgins/ontologies/2010/6/persona#Ecommerce>
 +
              ] ;
 +
 +
===FlatPersonaPerson (relevant sections only)===
 +
 +
rule #3:
 +
      map:relationshipsRule
 +
              [ rdf:type map:roleLiteral ;
 +
                map:mappedAtt <http://xmlns.com/foaf/0.1/gender> ;
 +
                map:predicate :gender ;
 +
                map:role map:roleParam
 
               ] .
 
               ] .
  
== getAttributes() flow ==
+
== call getAttributes(domain, attributes[], where[], future) ==
 +
 
 +
=== Call ===
 +
Example call to getAttributes:
 +
 
 +
* atts[0] := {id="#gender"}      //  gender (with nil namespace)
 +
* atts[1] := {id="#bFirstName"}  // "billing first name" (with nil namespace)
 +
* '''getAttributes''' (''future, "nytimes.com", atts[]'')
 +
 
 +
=== Execution ===
 +
* context := getConnectionContext ()
 +
** result: context == http://azigo.com/ptrevithick/nytimes.com)
 +
* call findRoles()
 +
** result:
 +
*** [[r=p:eCommerce, a={#gender}]
 +
***  [r=p:Buyer, a={#gender}]]
 +
* call sortByRole()
 +
** result:
 +
*** [[r=p:eCommerce, a={#gender}]
 +
***  [r=p:Buyer, a={#gender}]]
 +
* Try to pull attributes from #me person in the nytimes.com
 +
** result: no result: the nytimes.com context doesn't yet exist
 +
* Try to pull attributes from #me person in root context
 +
** call findPersonByRole()
 +
** result: nil (no persons found that match role)
 +
** result: no attribute/values found
 +
 
 +
== call setAttributes(''future, domain, attributes[]'') ==
 +
 
 +
=== Call ===
 +
 
 +
Example call to setAttributes:
 +
 
 +
''attVals[]'' is an array of Attributes:
 +
* attVals[0] := {id="#gender", value=["female"])
 +
* attVals[1] := {id=h"#bFirstName", value=["Alice"]) // "billing first name"
 +
 
 +
* '''setAttributes''' ("nytimes.com", attvals[])
 +
 
 +
=== Execution ===
 +
* context := getConnectionContext ()
 +
** result: context == http://azigo.com/ptrevithick/nytimes.com
 +
* template := getConnectionTemplate ()
 +
** result: template == http://azigo.com/sys/template/nytimes.com
 +
* Since ''context'' doesn't exist, create it from ''template''
 +
* newPersonRole := value of ''role'' attribute of Participant ContextPrototype
 +
** result: newPersonRole == p:Ecommerce
 +
* attributes[] := extractAttributes ()
 +
** result: attributes[] == (#gender, #bFirstName)
 +
* rolesAtts[] := findRoles()
 +
** result: rolesAtts[] == [{r=["p:Ecommerce"], a=[{id=#gender}]}, {r=["p:Buyer"], a=[{id=#bFirstName}]}]
 +
* sortByRole
 +
** result: rolesAtts[] == [{r=["p:Ecommerce"], a=[{id=#gender}]}, {r=["p:Buyer"], a=[{id=#bFirstName}]}]
 +
* person := http://azigo.com/ptrevithick/nytimes.com#me
 +
* Since ''person'' doesn't exist we create the statements:
 +
** (subj=:me pred=rdf:type obj=persona:Person) in ''context''
 +
** (subj=:me pred=p:role obj=(''newPersonRole''=="p:Ecommerce")) in ''context''
 +
* Loop[0] ra[0]=={r=["p:Ecommerce"], a=[{id=#gender, value=["female"]}]} // Loop: For every pair ra in rolesAtts...
 +
** targetPersons[] := findPersonsByRole (person, "p:Ecommerce")
 +
*** result: targetPersons[0] == <the :me person created above>; targetPersons[] is of size == 1
 +
** person == targetPersons[0]
 +
** Loop: a=={id=#gender value=["female"]}
 +
*** rule := getRule (template=http://azigo.com/sys/template/nytimes.com, #gender)
 +
**** result rule==(see "rule #2" in Initial State section above)
 +
*** '''0:pushEvalRule'''(person=:me, rule #2 above, value[0]="female")
 +
** EndLoop
 +
* Loop[0] ra[0]=={r=["p:Buyer"], a=[{id=#bFirstName, value=["Alice"]}]} // Loop: For every pair ra in rolesAtts...
 +
** targetPersons[] := findPersonsByRole (person, "p:Buyer")
 +
*** result: targetPersons[] is of size == 0
 +
** create new person and set the value of its role to p:Buyer
 +
*** new person is :7643
 +
** add new person :7643 to newPersons[]
 +
** Loop: a=={id=#bFirstName value=["Alice"]}
 +
*** rule := getRule (template=http://azigo.com/sys/template/nytimes.com, #bFirstName)
 +
**** result rule==(see "rule #1" in Initial State section above)
 +
*** '''1:pushEvalRule'''(person=:7643, rule #1 above, value[0]="Alice")
 +
** EndLoop
 +
* EndLoop
 +
* Loop for every person np in newPersons[]
 +
** result: add an h:correlation link from :me to <new person>
 +
 
 +
==== 0:pushEvalRule (:me, rule #2 above, "female") ====
 +
* mappingRule := getRuleName()
 +
** result: mappingRule == "roleSameAs" so call '''pushRoleSameAs''' (person=:me, rule #2 above, "female")
 +
 
 +
===== pushRuleSameAs (template, person=:me, rule, value)=====
 +
* equivAtt := getRuleField (rule, map:equivalentAttribute)
 +
** result: equivAtt == fp:gender
 +
* newRule := findRule (template, eqivAtt)
 +
** result: returns rule #3 above!
 +
* pushEvalRule (person=:me, newRule, "Alice") // recursion
 +
 
 +
==== 0:0: pushEvalRule (:me, rule #3 above, "female")====
 +
* mappingRule := getRuleName()
 +
** result: mappingRule == "roleLiteral" so call '''pushRoleLiteral''' (person=:me, rule #3 above, "female")
 +
 
 +
===== pushRoleLiteral (person=:me, rule #3, "female") =====
 +
* mappedAtt := getruleField()
 +
** result: mappedAtt == foaf:gender
 +
* add new foaf:gender attribute to :me and sets value to "female"
  
* Derive the name of the "connection" context (result: http://azigo.com/ptrevithick/staples.com)  
+
==== 1:pushEvalRule (person= :7643, rule #1 above, "Alice") ====
* Compute rolesAtts[] (result: ((
+
* mappingRule := getRuleField()
* We would now try to read attributes from the branch of person nodes rooted at its #me person
+
** result: mappingRule == rolePathLiteral
* However, since this doesn't exist we try to read attributes (call '''findAttributeValues'''()) from the root #me node (and on down)
+
* call pushRoleLiteral(template, 7643, rule #1, "Alice")
*
+
  
 +
===== pushRulePathLiteral(template, 7643, rule #1, "Alice") =====
 +
* path := getRuleField ()
 +
** result: path == "v:n"
 +
* since :7643 doesn't have a v:n attribute then we create a v:Name object
 +
** result obj:= new v:Name
 +
* mappedAtt := getRuleField ()
 +
** result: mappedAtt == v:given-name
 +
* since obj is new it doesn't have a v:given-name we add v:given-name to it
  
TODO: complete this
+
== Final State ==
 +
Red is newly created context
 +
[[Image:Pdsclient api example final 2.0.108.png|center]]

Latest revision as of 13:02, 29 September 2011

{{#eclipseproject:technology.higgins|eclipse_custom_style.css}}

We show an example of calling getAttributes and then calling setAttributes. In all cases we read/write the same two attributes in the nytimes.com namespace, bFirstName and phone.

TODO: a more realistic scenario would be showing a call to getCredentials() and then a call to setCredentials() followed by the getAttributes () and setAttributes () calls that are documented here.

Initial State

Contexts

Pdsclient api example initial 2.0.108.png

NYTimes template

The template context http://azigo.com/sys/templates/nytimes.com contains (among other things) a class named "http://nytimes.com" that has the following mapping rules:

 :NYTimesPerson
     a       owl:Class ;
     rdfs:subClassOf <http://www.eclipse.org/higgins/ontologies/2010/6/higgins#Person> ;

rule #1:

     map:nameRule
             [ rdf:type map:rolePathLiteral ;
               map:mappedAtt <http://www.w3.org/2006/vcard/ns#given-name> ;
               map:path <http://www.w3.org/2006/vcard/ns#n> ;
               map:predicate :bFirstName ;
               map:role <http://www.eclipse.org/higgins/ontologies/2010/6/persona#Buyer>
             ] ;

rule #2:

     map:relationshipsRule
             [ rdf:type map:roleSameAs ;
               map:equivalentAttribute
                       fp:gender ;
               map:predicate :gender ;
               map:role <http://www.eclipse.org/higgins/ontologies/2010/6/persona#Ecommerce>
             ] ;

FlatPersonaPerson (relevant sections only)

rule #3:

     map:relationshipsRule
             [ rdf:type map:roleLiteral ;
               map:mappedAtt <http://xmlns.com/foaf/0.1/gender> ;
               map:predicate :gender ;
               map:role map:roleParam
             ] .

call getAttributes(domain, attributes[], where[], future)

Call

Example call to getAttributes:

  • atts[0] := {id="#gender"} // gender (with nil namespace)
  • atts[1] := {id="#bFirstName"} // "billing first name" (with nil namespace)
  • getAttributes (future, "nytimes.com", atts[])

Execution

  • context := getConnectionContext ()
  • call findRoles()
    • result:
      • [[r=p:eCommerce, a={#gender}]
      • [r=p:Buyer, a={#gender}]]
  • call sortByRole()
    • result:
      • [[r=p:eCommerce, a={#gender}]
      • [r=p:Buyer, a={#gender}]]
  • Try to pull attributes from #me person in the nytimes.com
    • result: no result: the nytimes.com context doesn't yet exist
  • Try to pull attributes from #me person in root context
    • call findPersonByRole()
    • result: nil (no persons found that match role)
    • result: no attribute/values found

call setAttributes(future, domain, attributes[])

Call

Example call to setAttributes:

attVals[] is an array of Attributes:

  • attVals[0] := {id="#gender", value=["female"])
  • attVals[1] := {id=h"#bFirstName", value=["Alice"]) // "billing first name"
  • setAttributes ("nytimes.com", attvals[])

Execution

  • context := getConnectionContext ()
  • template := getConnectionTemplate ()
  • Since context doesn't exist, create it from template
  • newPersonRole := value of role attribute of Participant ContextPrototype
    • result: newPersonRole == p:Ecommerce
  • attributes[] := extractAttributes ()
    • result: attributes[] == (#gender, #bFirstName)
  • rolesAtts[] := findRoles()
    • result: rolesAtts[] == [{r=["p:Ecommerce"], a=[{id=#gender}]}, {r=["p:Buyer"], a=[{id=#bFirstName}]}]
  • sortByRole
    • result: rolesAtts[] == [{r=["p:Ecommerce"], a=[{id=#gender}]}, {r=["p:Buyer"], a=[{id=#bFirstName}]}]
  • person := http://azigo.com/ptrevithick/nytimes.com#me
  • Since person doesn't exist we create the statements:
    • (subj=:me pred=rdf:type obj=persona:Person) in context
    • (subj=:me pred=p:role obj=(newPersonRole=="p:Ecommerce")) in context
  • Loop[0] ra[0]=={r=["p:Ecommerce"], a=[{id=#gender, value=["female"]}]} // Loop: For every pair ra in rolesAtts...
    • targetPersons[] := findPersonsByRole (person, "p:Ecommerce")
      • result: targetPersons[0] == <the :me person created above>; targetPersons[] is of size == 1
    • person == targetPersons[0]
    • Loop: a=={id=#gender value=["female"]}
    • EndLoop
  • Loop[0] ra[0]=={r=["p:Buyer"], a=[{id=#bFirstName, value=["Alice"]}]} // Loop: For every pair ra in rolesAtts...
    • targetPersons[] := findPersonsByRole (person, "p:Buyer")
      • result: targetPersons[] is of size == 0
    • create new person and set the value of its role to p:Buyer
      • new person is :7643
    • add new person :7643 to newPersons[]
    • Loop: a=={id=#bFirstName value=["Alice"]}
      • rule := getRule (template=http://azigo.com/sys/template/nytimes.com, #bFirstName)
        • result rule==(see "rule #1" in Initial State section above)
      • 1:pushEvalRule(person=:7643, rule #1 above, value[0]="Alice")
    • EndLoop
  • EndLoop
  • Loop for every person np in newPersons[]
    • result: add an h:correlation link from :me to <new person>

0:pushEvalRule (:me, rule #2 above, "female")

  • mappingRule := getRuleName()
    • result: mappingRule == "roleSameAs" so call pushRoleSameAs (person=:me, rule #2 above, "female")
pushRuleSameAs (template, person=:me, rule, value)
  • equivAtt := getRuleField (rule, map:equivalentAttribute)
    • result: equivAtt == fp:gender
  • newRule := findRule (template, eqivAtt)
    • result: returns rule #3 above!
  • pushEvalRule (person=:me, newRule, "Alice") // recursion

0:0: pushEvalRule (:me, rule #3 above, "female")

  • mappingRule := getRuleName()
    • result: mappingRule == "roleLiteral" so call pushRoleLiteral (person=:me, rule #3 above, "female")
pushRoleLiteral (person=:me, rule #3, "female")
  • mappedAtt := getruleField()
    • result: mappedAtt == foaf:gender
  • add new foaf:gender attribute to :me and sets value to "female"

1:pushEvalRule (person= :7643, rule #1 above, "Alice")

  • mappingRule := getRuleField()
    • result: mappingRule == rolePathLiteral
  • call pushRoleLiteral(template, 7643, rule #1, "Alice")
pushRulePathLiteral(template, 7643, rule #1, "Alice")
  • path := getRuleField ()
    • result: path == "v:n"
  • since :7643 doesn't have a v:n attribute then we create a v:Name object
    • result obj:= new v:Name
  • mappedAtt := getRuleField ()
    • result: mappedAtt == v:given-name
  • since obj is new it doesn't have a v:given-name we add v:given-name to it

Final State

Red is newly created context

Pdsclient api example final 2.0.108.png

Back to the top